首页 > 代码库 > 521

521

关于521

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
 
描述

Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去。

浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到5、2、1三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如12356就算一个,而5111就不算。特别的,如果他看到了521三个数连续出现,会特别的愤怒。例如35210。

 
输入
多组测试数据:
一行给定两个数a,b(0<a,b<1000000),表示数字的开始和结束。
输出
一行显示他想要知道的数有几个及显示有多少个数字令他特别的愤怒。用空格隔开。
样例输入
200 500300 9001 600
样例输出
Case 1:2 0Case 2:2 1Case 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         else58             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....