2020 CSP-J 赛后总结

_脑波_

2020-11-13 22:38:54

Personal

## 这次考试纯属意外,心态炸了 ------------ **~~我诅咒出题人没有肺泡,只有骨骼肌!(当场去世)~~** ------------ 还是总结一下吧: ## 进入考场 我提前60分钟进入考场,找到座位后老师便让我出去等到考试前五分钟进入考场。比较有缘的是,我初赛时前面的人和后面的人都进入了第二轮,我们也是相邻而坐。我的同学ZC也来得很早,于是我们和一些其他学校的人攀谈起来。听说成都某外国语学校的光辉事迹——全校去考初赛为了补录名额,但在这里得到了成都某外国语学校的同学否认了。 ## 开考 考试开始后,那个密码我的旁边的人一直输入输入不起,老师和我都过来看了,最后都不成。于是老师借了我的U盘拷到了他的电脑上(U盘是放在袋子里,放在教室前面的),于是浪费了10min。。。 ## T1 [题目传送门](https://www.luogu.com.cn/problem/P7071) before做T1时,我浏览了一下所有的题,发现最后一题好像类似一个我们模拟赛(教练自己出题)时考的奇怪的贪心题。心情大好,一下子就用2进制把第一题A了。 贴上你们最爱的代码(考试时): ```cpp #include<bits/stdc++.h> #define N 35 using namespace std; int n,w; bool a[N]={},sf=0; void cf(int num){ if(n==0)return ; if(n%2==1){ w=num; a[num]=1; } n=n/2; cf(num+1); } int main(){ freopen("power.in","r",stdin); freopen("power.out","w",stdout); cin>>n; cf(0); if(a[0]==1)cout<<-1; else{ for(int i=w;i>=1;i--){ if(a[i]==1)cout<<(1<<i)<<" "; } } return 0; } ``` ## T2 [题目传送门](https://www.luogu.com.cn/problem/P7072) 我看到第二题,想到了大家都能想到的,每次加入一个数,然后sort一遍就可以了。但自己算了一下复杂度最多50分,所以开始想优化。开始想它每次都会插入一个数继续排序,于是就想到了每次插入一个后冒泡升上去(或者插入到指定位置,插入排序)+一个二分查找,但我觉得有点麻烦。后来,我看到了一个让我兴奋的东西,每人的分数<=600,伟大的桶排就出现了。桶排的思路也就是每次对应的桶++,然后倒序查找。 又是最美丽的代码(考试时): ```cpp #include<bits/stdc++.h> using namespace std; int n,w; int tp[650];bool ok; int xs,gs,maxn=0,yq; int main(){ freopen("live.in","r",stdin); freopen("live.out","w",stdout); cin>>n>>w; for(int i=1;i<=n;i=-~i){ cin>>xs; maxn=max(maxn,xs); ++tp[xs]; gs=0;yq=max(1,int(i*w/100));ok=0; for(int i=maxn;;i--){ if(tp[i]!=0){ int fj=tp[i]; while(1){ if(fj==0)break; --fj; ++gs; if(gs==yq){ cout<<i<<" "; ok=1; break; } } } if(ok) break; } } return 0; } ``` ## T3 [题目传送门](https://www.luogu.com.cn/problem/P7073) 第三题我的第一个思路就是二叉树优化,但是呢,好像代码很难写,我又去想另一个思路。我于是发现了好像可以用记忆化搜索,就是记录每一次的处理值,如果没有改变,那后面的也不会改变。但是在存的时候却不好存,看到时间只有一小时了,所以我果断暴力栈。。。 又是代码。。。 ```cpp #include<bits/stdc++.h> using namespace std; char c[1000001]; bool x[100001]; stack<bool>n; int s,q,fm;int sum,js; char getch(){ ++js; return c[js]; } bool ans(){ js=0; char ch=getch(); while(ch!='\n'){ if(ch>='a'&&ch<='z'){ int num=0;ch=getch(); while(ch<='9'&&ch>='0')num=(num<<3)+(num<<1)+ch-'0',ch=getch(); n.push(x[num]); } if(ch=='!'){ bool fj=n.top(); n.pop(); n.push(!fj); } if(ch=='|'){ bool fj1=n.top(); n.pop(); bool fj2=n.top(); n.pop(); n.push(fj1|fj2); } if(ch=='&'){ bool fj1=n.top(); n.pop(); bool fj2=n.top(); n.pop(); n.push(fj1&fj2); } ch=getch(); } return n.top(); } int main(){ //freopen("expr.in","r",stdin); ////////freopen("expr.out","w",stdout); char dick=getchar(); while(dick!='\n'){ ++sum; c[sum]=dick; dick=getchar(); } c[sum+1]='\n'; cin>>s; for(int i=1;i<=s;i=-~i)cin>>x[i]; cin>>q; while(q--){ cin>>fm; x[fm]=!x[fm]; cout<<ans()<<endl; n.pop(); x[fm]=!x[fm]; } } ``` ## T4 [题目传送门](https://www.luogu.com.cn/problem/P7074) 第四题开始我一看是DP,看到上下左(并不是下左),哦嚯!我放弃了,所以怒写一个爆搜。写完之后发现还有30分钟,于是写了一个记忆化搜索,就开了3 * 1001 * 1001的数组,但我觉得好像这个数组会超,于是在最后写了一个 ```cpp cout<<sizeof(jyh); ``` 发现没有超,心里十分开心!满以为自己能考省一。 代码如下(考试源代码) ```cpp #include<bits/stdc++.h> #define N 1002 using namespace std; int jz[N][N],n,m; long long jyh[3][N][N]; long long dfs(int x,int y,short syb/*0> 1^ 2\/*/){ if(jyh[syb][x][y]!=-1e18)return jyh[syb][x][y]; if(x==n&&y==m)return jz[x][y]; long long maxn=-1e18; if(x==n){//x在最下面一行 maxn=max(dfs(x,y+1,0),maxn);// 向右走 if(syb==0)maxn=max(dfs(x-1,y,1),maxn);//下面边界,上一步是右可以向上走 } if(y==m)maxn=max(dfs(x+1,y,2),maxn); if(x==1){//如果在最上一行 if(y!=m){//如果y不在最后一列 maxn=max(dfs(x,y+1,0),maxn);//向右走 if(syb==0)maxn=max(dfs(x+1,y,2),maxn);//shang面边界,上一步是右可以向下走 } } if(x!=1&&x!=n&&y!=m){ maxn=max(dfs(x,y+1,0),maxn); if(syb==0){ maxn=max(dfs(x-1,y,1),maxn); maxn=max(dfs(x+1,y,2),maxn); } if(syb==1)maxn=max(dfs(x-1,y,1),maxn); if(syb==2)maxn=max(dfs(x+1,y,2),maxn); } jyh[syb][x][y]=maxn+jz[x][y]; return maxn+jz[x][y]; } int main(){ //freopen("number.in","r",stdin); //freopen("number.out","w",stdout); for(int i=1;i<=1001;i=-~i) for(int j=1;j<=1001;j=-~j) jyh[0][i][j]=-1e18,jyh[1][i][j]=-1e18,jyh[2][i][j]=-1e18; cin>>n>>m; for(int i=1;i<=n;i=-~i) for(int j=1;j<=m;j=-~j) cin>>jz[i][j]; cout<<dfs(1,1,0); cout<<sizeof(jyh); } ``` ## 民间数据 当民间数据出来时,我就把发下来的代码交了上去,结果100+95(莫名T了一个点)+35+0,最后一题爆0令我很惊奇!我查看了代码,当仔细浏览一遍时,我呆住了,我的最后一行写着大大的“cout<<sizeof(jyh)”,我小心翼翼得删掉了它,交到洛谷上去。 …… AC,你通过了此题…… 这是我最大的遗憾。。。 ## 总结 ~~这次难度偏低,总体在DP难度之下,最主要是我的最后一题,唉,明年努力吧!~~ ### 常记洛谷刷咕,AC不知何处。大佬皆姓周,误入黑题深处。呕吐,呕吐,写一行while(true)