关于521
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去。
浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到5、2、1三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如12356就算一个,而5111就不算。特别的,如果他看到了521三个数连续出现,会特别的愤怒。例如35210。
- 输入
- 多组测试数据:
一行给定两个数a,b(0<a,b<1000000),表示数字的开始和结束。 输出 - 一行显示他想要知道的数有几个及显示有多少个数字令他特别的愤怒。用空格隔开。 样例输入
200 500 300 900 1 600
样例输出Case 1:2 0 Case 2:2 1 Case 3:6 1
- 第一次写的程序 提交上去超时。。。
#include<stdio.h> int main() { int a,b; int j=1; while(scanf("%d %d",&a,&b)!=EOF) { int i,m=0,x=0,y=0,z=0,c=0; for(;a<=b;a++) { int i=a; x=0; y=0; z=0; while(i) { if(i%1000==521) { m++; break; } if(i%10==1) x++; if(i%10==2) y++; if(i%10==5) z++; i=i/10; } if(x&&y&&z) c++; } printf("Case %d:%d %d\n",j++,c+m,m); } return 0; }第二次改的程序(我没改出来 嘤嘤嘤~)
这个是同学写的 佩服佩服
#include<stdio.h> int m[1000001]={0}; int n[1000001]={0}; int main() { int a,b,i,j=1; int c[7]={0}; for(i=1;i<=1000000;i++) { int r=0,s=0,t=0; c[0]=i%10; c[1]=i/10%10; c[2]=i/100%10; c[3]=i/1000%10; c[4]=i/10000%10; c[5]=i/100000%10; c[6]=i/1000000%10; if(c[0]==1||c[1]==1||c[2]==1||c[3]==1||c[4]==1||c[5]==1||c[6]==1) r=1; if(c[0]==2||c[1]==2||c[2]==2||c[3]==2||c[4]==2||c[5]==2||c[6]==2) s=1; if(c[0]==5||c[1]==5||c[2]==5||c[3]==5||c[4]==5||c[5]==5||c[6]==5) t=1; if(r==1&&s==1&&t==1) m[i]=m[i-1]+1; else m[i]=m[i-1]; if(c[0]==1&&c[1]==2&&c[2]==5||c[1]==1&&c[2]==2&&c[3]==5||c[2]==1&&c[3]==2&&c[4]==5||c[3]==1&&c[4]==2&&c[5]==5||c[4]==1&&c[5]==2&&c[6]==5) n[i]=n[i-1]+1; else n[i]=n[i-1]; } while(~scanf("%d %d",&a,&b)) { printf("Case %d:%d %d\n",j,m[b]-m[a-1],n[b]-n[a-1]); j++; } return 0; }于是乎,寡人在网上搜到了最优化的算法...呛呛呛呛!
#include<stdio.h> int a[2][1000001]={0}; int main() { int k=0,i,sum=0; for(i=1;i<=1000000;i++) { if((i%10==5||(i/10)%10==5||(i/100)%10==5||(i/1000)%10==5||(i/10000)%10==5||(i/100000)%10==5)&&(i%10==2||(i/10)%10==2||(i/100)%10==2||(i/1000)%10==2||(i/10000)%10==2||(i/100000)%10==2)&&(i%10==1||(i/10)%10==1||(i/100)%10==1||(i/1000)%10==1||(i/10000)%10==1||(i/100000)%10==1)) { sum++; if(i/1000==521||(i/100)%1000==521||(i/10)%1000==521||i%1000==521) k++; } a[0][i]+=sum; a[1][i]+=k; } int m,n,w=0; while(scanf("%d%d",&n,&m)!=EOF) printf("Case %d:%d %d\n",++w,a[0][m]-a[0][n-1],a[1][m]-a[1][n-1]); }
- 多组测试数据:
1233

被折叠的 条评论
为什么被折叠?



