[Codeforces]Round246 div2 解题报告
2014-09-10 22:31
417 查看
第一次上1700
顺便把没做出来的题都写了,纪念一下吧。
A. inc ARG
题目大意
一个二进制数倒序输入
超过n位的数字将被丢弃
求给定数字+1后改变的数字位数
阅读理解,直接模拟,刷榜水题
B. Inbox (100500)
题目大意
一个邮箱有n封邮件,每一封邮件都有已读(0)和未读(1)两个状态
每秒钟可以
1)返回邮件列表
2)进入某一封信
3)查看上/下一封信
问所有邮件变为已读的最短时间
我们发现一旦对于连续的1后面接上的0,如果只有一个,那跳出再进入的代价和连续翻两页的代价一致。而如果0超过了两个,那直接跳出更划算。
则1后面遇到0就跳出(特判后面没有未读信的情况),0后面遇到1就进入,1后面遇到1就向下滑动一页,否则不做处理。
C. No to Palindromes!
题目大意
给定无回文字符串的定义:其任意连续子串都不是回文
给定一个无回文,长度为n,最大的字母,问按字典序其下一个无回文是什么
观察性质
则对于 i>=1 有s[i-1]!=s[i]
则对于 i>=2 有s[i-2]!=s[i]
直接从最后一位自增,如果没有办法自增就考虑字母顺序换掉上一位
D. Restore Cube
题目大意
一个正方体的八个坐标被更换(x,y,z乱序)
求是否存在原来的正方形
任输出一种方案
6^7暴力
我的判断方法是计算是否有12条棱12个面对角线4个体对角线(因为有向所以*2)
E. Substitutes in Number
题目大意
长度为n的数
m次变换 每次变换将其中的一位数(所有等于x的都算)变为y,可能为一串数,一个数,或空串。
求m次变换后的数字模1e9+7的结果
倒着dp
每一步存放数字x表示的最终的数字串,和x表示的数字位数(1^n%(1e9+7))
最后扫一遍原来的字符串就可以算出结果
顺便把没做出来的题都写了,纪念一下吧。
A. inc ARG
题目大意
一个二进制数倒序输入
超过n位的数字将被丢弃
求给定数字+1后改变的数字位数
阅读理解,直接模拟,刷榜水题
#include <cstdio> #include <iostream> #include <algorithm> #include <ctime> #include <cctype> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> #define sqr(x) ((x)*(x)) #define LL long long #define INF 0x3f3f3f3f #define PI acos(-1.0) #define eps 1e-10 #define mod 998244353ll using namespace std; int a[5005],b[505]; int main() { int n; while (~scanf("%d",&n)) { char c; c=getchar(); for (int i=1;i<=n;i++) { scanf("%c",&c); a[i]=c-'0'; } c=getchar(); for (int i=1;i<=n;i++) b[i]=a[i]; b[1]++; for (int i=1;i<=n;i++) if(b[i]==2) { b[i+1]++; b[i]=0; } int ans=0; for (int i=1;i<=n;i++) if (a[i]!=b[i]) ans++; printf("%d\n",ans); } }
B. Inbox (100500)
题目大意
一个邮箱有n封邮件,每一封邮件都有已读(0)和未读(1)两个状态
每秒钟可以
1)返回邮件列表
2)进入某一封信
3)查看上/下一封信
问所有邮件变为已读的最短时间
我们发现一旦对于连续的1后面接上的0,如果只有一个,那跳出再进入的代价和连续翻两页的代价一致。而如果0超过了两个,那直接跳出更划算。
则1后面遇到0就跳出(特判后面没有未读信的情况),0后面遇到1就进入,1后面遇到1就向下滑动一页,否则不做处理。
#include <cstdio> #include <iostream> #include <algorithm> #include <ctime> #include <cctype> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> #define sqr(x) ((x)*(x)) #define LL long long #define INF 0x3f3f3f3f #define PI acos(-1.0) #define eps 1e-10 #define mod 998244353ll using namespace std; int a[5005]; int sum[5005]; int main() { int n; while (~scanf("%d",&n)) { memset(a,0,sizeof a); memset(sum,0,sizeof sum); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); } for (int i=n;i>=1;i--) { sum[i]=sum[i+1]+a[i]; } int ans=0; for (int i=1;i<=n;i++) { if (a[i-1]==0&&a[i]==1) ans++; if (a[i-1]==1&&a[i]==1) ans++; if ((a[i-1]==1&&a[i]==0)&&sum[i]) ans++; } printf("%d\n",ans); } }
C. No to Palindromes!
题目大意
给定无回文字符串的定义:其任意连续子串都不是回文
给定一个无回文,长度为n,最大的字母,问按字典序其下一个无回文是什么
观察性质
则对于 i>=1 有s[i-1]!=s[i]
则对于 i>=2 有s[i-2]!=s[i]
直接从最后一位自增,如果没有办法自增就考虑字母顺序换掉上一位
#include <cstdio> #include <iostream> #include <algorithm> #include <ctime> #include <cctype> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> #define sqr(x) ((x)*(x)) #define LL long long #define INF 0x3f3f3f3f #define PI acos(-1.0) #define eps 1e-10 #define mod 998244353ll using namespace std; char a[1005]; char s[1005]; int flag; int n,p; int check (int x) { return ((n<2||(a[x-1]!=a[x-2]))&&((n<3)||(a[x-1]!=a[x-3]))); } int main() { while (~scanf("%d%d",&n,&p)) { flag=0; char c; c=getchar(); scanf("%s",a); int pt=n; while (flag==0) { if (pt==0) break; a[pt-1]++; if (a[pt-1]>'a'+p-1) { pt--;continue; } if (check(pt)==0){ continue; } if (check(pt)){ if (pt==n) {flag=1;break;} else {pt++;a[pt-1]='a'-1;continue;} } } if (flag==0) puts("NO"); else printf("%s\n",a); } }
D. Restore Cube
题目大意
一个正方体的八个坐标被更换(x,y,z乱序)
求是否存在原来的正方形
任输出一种方案
6^7暴力
我的判断方法是计算是否有12条棱12个面对角线4个体对角线(因为有向所以*2)
#include <cstdio> #include <iostream> #include <algorithm> #include <ctime> #include <cctype> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> #define sqr(x) ((x)*(x)) #define LL long long #define INF 0x3f3f3f3f #define PI acos(-1.0) #define eps 1e-10 using namespace std; int flag; struct node { LL x,y,z; }; node t[10]; LL tmp[10][10]; int k; LL dis(node a,node b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z); } void print() { puts("YES"); for (int i=1;i<=8;i++) printf("%I64d %I64d %I64d\n",t[i].x,t[i].y,t[i].z); flag=1; } void detect() { k++; if (flag==1) return ; LL mi=1e18; for (int i=1;i<=8;i++) for (int j=1;j<=8;j++) if (i!=j) mi=min(mi,tmp[i][j]=dis(t[i],t[j])); int cnt1=0; int cnt2=0; int cnt3=0; if (mi==0) return ; for (int i=1;i<=8;i++) for (int j=1;j<=8;j++) if (i!=j) { if (mi==tmp[i][j]) cnt1++; if (mi*2==tmp[i][j]) cnt2++; if (mi*3==tmp[i][j]) cnt3++; } if (cnt1==24) if (cnt2==24) if (cnt3==8) print(); } void dfs(int x) { if (flag==1) return ; if (x>8) { detect(); return ; } dfs(x+1); swap(t[x].y,t[x].z); dfs(x+1); swap(t[x].x,t[x].y); dfs(x+1); swap(t[x].y,t[x].z); dfs(x+1); swap(t[x].y,t[x].x); dfs(x+1); swap(t[x].y,t[x].z); dfs(x+1); } int main() { while (~scanf("%I64d%I64d%I64d",&t[1].x,&t[1].y,&t[1].z)) { flag=0; k=0; for (int i=2;i<=8;i++) scanf("%I64d%I64d%I64d",&t[i].x,&t[i].y,&t[i].z); // puts("QUQ"); dfs(2); if (flag==0) puts("NO"); // printf("%d\n",k); } }
E. Substitutes in Number
题目大意
长度为n的数
m次变换 每次变换将其中的一位数(所有等于x的都算)变为y,可能为一串数,一个数,或空串。
求m次变换后的数字模1e9+7的结果
倒着dp
每一步存放数字x表示的最终的数字串,和x表示的数字位数(1^n%(1e9+7))
最后扫一遍原来的字符串就可以算出结果
#include <cstdio> #include <string> #include <cstring> #define LL long long #define mod 1000000007ll using namespace std; LL pos[20],num[20]; string s[100005]; char p[100005],c; int main() { int n; while (~scanf("%s%d",p,&n)) { c=getchar(); for (int i=1;i<=n;i++) { s[i]=""; while ((c=getchar())!='\n') s[i]=s[i]+c; } for (int i=0;i<10;i++) { pos[i]=10; num[i]=i; } LL tnum,tpos; for (int i=n;i;i--) { tnum=0; tpos=1; int l=s[i].size(); for (int j=l-1;j>2;j--) { tnum=(tnum+(tpos*num[s[i][j]-'0'])%mod)%mod; tpos=tpos*pos[s[i][j]-'0']%mod; } // printf("%I64d %I64d \n",tnum,tpos); pos[s[i][0]-'0']=tpos; num[s[i][0]-'0']=tnum; } int l=strlen(p); tnum=0; tpos=1; for (int j=l-1;j>=0;j--) { tnum=(tnum+(tpos*num[p[j]-'0'])%mod)%mod; tpos=tpos*pos[p[j]-'0']%mod; } printf("%I64d\n",tnum); } }
相关文章推荐
- [Codeforces]Round246 div2 解题报告
- Codeforces 474(#271 Div 2) 解题报告
- codeforces 338(Div 2) B. Longtail Hedgehog 解题报告
- Codeforces 471 Div2 B 解题报告
- Codeforces 467(#267 (Div. 2) ) 解题报告
- Codeforces 448(#256 (Div. 2) ) 解题报告
- Codeforces 451(#258 (Div. 2) ) 解题报告
- codeforces_235_div2解题报告
- Codeforces 441 (Div.1) 解题报告
- codeforces_240_div1解题报告
- Codeforces 450(#257 (Div. 2) ) 解题报告
- [Codeforces] Round #249 (Div. 2)解题报告(ABC)
- codeforces_233_div2解题报告
- codeforces_229_div2解题报告
- Codeforces 410 div 2 【解题报告】
- Codeforces 459(#261 (Div. 2) ) 解题报告
- Codeforces 486(#277 Div 2) 解题报告
- Codeforces Round #467 (Div. 2) 解题报告
- Codeforces Round #195 (Div. 2) 解题报告
- cf 164 div2 解题报告