☰
CSP-J 2026 第二轮代码
2026/11/5 5:34:29 网站建设 项目流程

P17827 [CSP-J 2026] 旅游 / travel

#include <bits/stdc++.h> using namespace std; string chexiang[3], zuowei[3]; int main() { cin >> chexiang[1] >> zuowei[1] >> chexiang[2] >> zuowei[2]; if(chexiang[1]==chexiang[2]){ cout << 1; if(zuowei[1][0]==zuowei[2][0] && zuowei[1][1]==zuowei[2][1]){ cout << 1; if(zuowei[1][2]>='A' && zuowei[1][2]<='C' && zuowei[2][2]>='A' && zuowei[2][2]<='C' || zuowei[1][2]>='D' && zuowei[1][2]<='F' && zuowei[2][2]>='D' && zuowei[2][2]<='F'){ cout << 1; if(zuowei[1][2]=='D' || zuowei[1][2]=='F' || abs(zuowei[1][2]-zuowei[2][2])==1){ cout << 1; } else{ cout << 0; } } else{ cout << "00"; } } else{ cout << "000"; } } else{ cout << "0000"; } return 0; }

P17828 [CSP-J 2026] 回文串 / string

68分暴力代码

#include <bits/stdc++.h> using namespace std; int n, len, ans, a; char c, s[100000010]; int main() { scanf("%d", &n); for(int i=1; i<=n; ++i){ cin >> a >> c; while(a--){ len++; s[len]=c; } } for(int i=1; i<=len/2; ++i){ if(s[i]!=s[len-i+1]){ ans++; } } printf("%d\n", ans); return 0; }

100分AC代码

#include <bits/stdc++.h> using namespace std; int n, a[200010], l, r; long long ans, len, l_len, r_len; char c[200010]; int main() { scanf("%d", &n); for(int i=1; i<=n; ++i){ cin >> a[i] >> c[i]; //每一段的长度a[i]以及每一段的字符c[i] len+=a[i]; //记录序列总长度 } l=1; r=n; while(l<r){ //如果左边把第l段都加上, 没有超过中点 if(l_len+a[l]<=len/2){ l_len+=a[l]; //把第l段都加到左边 while(l_len>r_len){ //只要右边的长度没有达到左边的长度, 则把r一直向左移动 if(r_len+a[r]<=l_len){ //如果右边把第r段都加上, 没有超过左边的长度 if(c[r]!=c[l]){ //如果右边第r段的字符和左边第l段的字符不一样 ans+=a[r]; } r_len+=a[r]; //更新右边的长度 r--; //r向左移动 } else{ //如果右边把第r段都加上超过左边的长度, 只加一部分, 使得和右边持平 if(c[r]!=c[l]){ ans+=l_len-r_len; } a[r]-=l_len-r_len; //只加一部分, r不左移动, 改变a[r]的长度即可 r_len=l_len; } } if(l_len==r_len && l_len==len/2){ break; } } else{ //如果左边把第l段都加上, 超过中点了 l_len=len/2; //左边只加一部分, 到len/2就行 while(l_len>r_len){ //只要右边的长度没有达到左边的长度, 则把r一直向左移动 if(r_len+a[r]<=l_len){ //如果右边把第r段都加上, 没有超过左边的长度 if(c[r]!=c[l]){ //如果右边第r段的字符和左边第l段的字符不一样 ans+=a[r]; } r_len+=a[r]; //更新右边的长度 r--; //r向左移动 } else{ if(c[r]!=c[l]){ //如果右边把第r段都加上超过左边的长度, 只加一部分, 使得和右边持平 ans+=l_len-r_len; } a[r]-=l_len-r_len; //只加一部分, r不左移动, 改变a[r]的长度即可 r_len=l_len; } } if(l_len==r_len && l_len==len/2){ break; } } l++; } printf("%lld\n", ans); return 0; }

P17829 [CSP-J 2026] 按位与 / and

#include <bits/stdc++.h> using namespace std; int n, m, a[200010], cur_n, num1[32], ans; bool flag[200010][32]; void cal(int x, int id) { int asd=x, cnt=0; while(asd){ num1[cnt]+=asd%2; flag[id][cnt]=asd%2; cnt++; asd/=2; } return; } int main() { scanf("%d %d", &n, &m); cur_n=n; for(int i=1; i<=n; ++i){ scanf("%d", &a[i]); cal(a[i], i); } for(int i=29; i>=0; --i){ cur_n=0; if(num1[i]>=m){ for(int j=1; j<=n; ++j){ if(flag[j][i]){ cur_n++; a[cur_n]=a[j]; } } memset(num1, 0, sizeof(num1)); memset(flag, 0, sizeof(flag)); for(int j=1; j<=cur_n; ++j){ cal(a[j], j); } n=cur_n; ans+=pow(2, i); } } printf("%d\n", ans); return 0; }

P17830 [CSP-J 2026] 纸牌游戏 / card

36分部分分代码,直接按思路去模拟

#include <bits/stdc++.h> using namespace std; int n, m, a[500010], ans[300010], cur[300010], cnt, asd; bool vis[300010]; void deal(int x) { for(int i=1; i<=cnt; ++i){ if(cur[i]==x){ for(int j=i+1; j<=cnt; ++j){ vis[cur[j]]=false; } cnt=i; return; } } } int main() { scanf("%d %d", &n, &m); for(int i=1; i<=n; ++i){ scanf("%d", &a[i]); } for(int i=1; i<=n; ++i){ cnt=0; for(int j=i; j<=n; ++j){ asd=a[j]; //前面出现过 if(vis[asd]){ deal(asd); } else{ cnt++; cur[cnt]=asd; vis[asd]=true; } } for(int j=1; j<=cnt; ++j){ ans[cur[j]]++; vis[cur[j]]=false; } } for(int i=1; i<=m; ++i){ printf("%d ", ans[i]); } return 0; }

44分小优化代码,如果和前一个相等,则只删一个数,不需要再次枚举

#include <bits/stdc++.h> using namespace std; int n, m, a[500010], ans[300010], cur[300010], cnt, asd; bool vis[300010]; void deal(int x) { if(cur[cnt]==x){ return; } for(int i=1; i<=cnt; ++i){ if(cur[i]==x){ for(int j=i+1; j<=cnt; ++j){ vis[cur[j]]=false; } cnt=i; return; } } } int main() { scanf("%d %d", &n, &m); for(int i=1; i<=n; ++i){ scanf("%d", &a[i]); } for(int i=1; i<=n; ++i){ cnt=0; for(int j=i; j<=n; ++j){ asd=a[j]; //前面出现过 if(vis[asd]){ deal(asd); } else{ cnt++; cur[cnt]=asd; vis[asd]=true; } } for(int j=1; j<=cnt; ++j){ ans[cur[j]]++; vis[cur[j]]=false; } } for(int i=1; i<=m; ++i){ printf("%d ", ans[i]); } return 0; }

60分代码,如果和前一个相等,输入时只记录一个数,再开一个数组记录每个数出现的次数

#include <bits/stdc++.h> using namespace std; int n, m, a[500010], ans[300010], cur[300010], cnt, asd, total[300010], N; bool vis[300010]; void deal(int x) { for(int i=1; i<=cnt; ++i){ if(cur[i]==x){ for(int j=i+1; j<=cnt; ++j){ vis[cur[j]]=false; } cnt=i; return; } } } int main() { scanf("%d %d", &n, &m); for(int i=1; i<=n; ++i){ scanf("%d", &asd); if(asd==a[N]){ total[N]++; } else{ N++; a[N]=asd; total[N]=1; } } n=N; for(int i=1; i<=n; ++i){ cnt=0; for(int j=i; j<=n; ++j){ asd=a[j]; //前面出现过 if(vis[asd]){ deal(asd); } else{ cnt++; cur[cnt]=asd; vis[asd]=true; } } for(int j=1; j<=cnt; ++j){ ans[cur[j]]+=total[i]; vis[cur[j]]=false; } } for(int i=1; i<=m; ++i){ printf("%d ", ans[i]); } return 0; }

100分AC正解

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询