时间限制:1000 ms | 内存限制:65535 KB 难度:2
描述
Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去,
NYOJ关于521
。浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到5、2、1三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如12356就算一个,而5111就不算。特别的,如果他看到了521三个数连续出现,会特别的愤怒。例如35210。
输入
多组测试数据:
一行给定两个数a,b(0 输出
一行显示他想要知道的数有几个及显示有多少个数字令他特别的愤怒。用空格隔开。
样例输入
200 500
300 900
1 600
样例输出
Case 1:2 0
Case 2:2 1
Case 3:6 1
开始一直TLE,后来看了别人的代码,才发现应该先范围内的数都判断一遍,这样就不用每次都判断,直接在存储的数组中找就可以了哈!
超时代码如下
#include <iostream></p><p> using std::endl;</p><p> using std::cout;</p><p> using std::cin;</p><p> int main()</p><p> {</p><p> int a , b;</p><p> int cnt = 0;</p><p> while(cin >> a >> b)</p><p> {</p><p> cnt++;</p><p> int s[6];</p><p> int cnt1 = 0 , cnt2 = 0;</p><p> for(int j=a; j<=b;++j)</p><p> {</p><p> int five=0 , two = 0, ne = 0;</p><p> s[0] = j % 10;</p><p> s[1] = j / 10 % 10;</p><p> s[2] = j / 100 % 10;</p><p> s[3] = j / 1000 % 10;</p><p> s[4] = j / 10000 % 10;</p><p> s[5] = j / 100000 % 10;</p><p> for(int i=0 ; i<4;++i)</p><p> {</p><p> if(s[i] == 1 && s[i+1] == 2 && s[i+2] == 5)</p><p> {</p><p> cnt2++;</p><p> break;</p><p> }</p><p> }</p><p> for(int i=0 ; i<6; ++i)</p><p> {</p><p> if(s[i] == 5)</p><p> {</p><p> five++;</p><p> continue;</p><p> }</p><p> if(s[i] == 2)</p><p> {</p><p> two++;</p><p> continue;</p><p> }</p><p> if(s[i] == 1)</p><p> {</p><p> one++;</p><p> continue;</p><p> }</p><p> }</p><p> if(five && two && one)</p><p> cnt1++;</p><p> }</p><p> cout << "Case " <<cnt <<="" ":"="" cnt1="" "="" <<cnt2="" endl;="" }="" return="" 0;="" <="" pre="">
#include
#include
using std::endl;
using std::cout;
using std::cin;
int main()
{
int data1[1000000] , data2[1000000];
int s[6];
//把范围之内的数全都模拟一次,累积符合条件的次数放到数组中
for(int j=125; j<1000000; ++j)
{