Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去。
浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到5、2、1三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如12356就算一个,而5111就不算。特别的,如果他看到了521三个数连续出现,会特别的愤怒。例如35210。
200 500 300 900 1 600
Case 1:2 0 Case 2:2 1 Case 3:6 1
有重复计算类型的题目要注意优化,不然会超时的哦~
1 #include<stdio.h> 2 int s1[1000000],s2[1000000]; 3 void fun(int a, int b) 4 { 5 int i,ii; 6 bool t1,t2,t3,t4; 7 s1[0] = s2[0] = s1[1] = s2[1] = 0; 8 for(i=a; i <= b; i++){ 9 ii = i; 10 t1 = t2 = t3 = t4 =false; 11 while(ii != 0 ){ 12 int a = ii %10; 13 if( a == 5) 14 { 15 t1 = true; 16 } 17 else if( a == 2) 18 { 19 t2 = true; 20 } 21 else if( a == 1) 22 { 23 t3 = true; 24 } 25 ii = ii / 10; 26 } 27 if(t1 && t2 && t3){ 28 s1[i-1] = s1[i-2] + 1; 29 ii = i; 30 while(ii != 0 ){ 31 int a = ii % 10; 32 int b = (ii / 10) % 10; 33 int c = (ii / 100) % 10; 34 if( c > 0 && a == 1 && b == 2 && c ==5) 35 t4 = true; 36 ii = ii / 10; 37 } 38 if(t4) 39 s2[i-1] = s2[i-2] + 1; 40 else 41 s2[i-1] = s2[i-2]; 42 } 43 else{ 44 s2[i-1] = s2[i-2]; 45 s1[i-1] = s1[i-2]; 46 } 47 } 48 } 49 50 int main() 51 { 52 int a,b,i=1; 53 fun(2,1000000); 54 while(scanf("%d%d",&a,&b) != EOF){ 55 if(a == 1) 56 printf("Case %d:%d %d\n",i,s1[b-1]-s1[a-1],s2[b-1]-s2[a-1]); 57 else 58 printf("Case %d:%d %d\n",i,s1[b-1]-s1[a-2],s2[b-1]-s2[a-2]); 59 i++; 60 } 61 return 0; 62 }
learning....
原文地址:http://www.cnblogs.com/george-cw/p/3833602.html