nyoj 975-关于521 (EOF)

975-关于521


内存限制:64MB 时间限制:1000ms 特判: No
通过数:5 提交数:46 难度: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

C/C++:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <set>
#include <map>
#include <queue>
#include <climits>
#include <bitset>
#define PI 3.1415926

using namespace std;
int CNT1[1000010]={0}, CNT2[1000010]={0};

inline int judge(int n)
{
    int flag1 = 0, flag2 = 0, flag5 = 0, flag = 0;
    int A[10] = {0}, cnt = 0;
    while (n)
    {
        int temp = n % 10;
        A[cnt ++] = temp;
        if (temp == 1) flag1 = 1;
        if (temp == 2) flag2 = 1;
        if (temp == 5) flag5 = 1;
        n /= 10;
    }
    if (flag1 == 1 && flag2 == 1 && flag5 == 1) flag = 1;

    if (flag)
    {
        for (int i = 0; i <= cnt - 3; ++ i)
        {
            if (A[i] == 1 && A[i + 1] == 2 && A[i + 2] == 5)
                return 2;
        }
        return 1;
    }
    return 0;
}

int main()
{
    int cnt1 = 0, cnt2 = 0;
    for (int i = 1; i <= 1000000; ++ i)
    {
        int temp = judge(i);
        if (temp == 1)
            cnt1 ++;
        if (temp == 2)
            cnt1 ++, cnt2 ++;
        CNT1[i] = cnt1, CNT2[i] = cnt2;
    }

    int m, n, k = 1;
    ios::sync_with_stdio(false);
    while(~scanf("%d%d", &m, &n))
    {
        int ans1 = CNT1[n] - CNT1[m - 1];
        int ans2 = CNT2[n] - CNT2[m - 1];
        cout <<"Case " <<k ++ <<":" <<ans1 <<" " <<ans2 <<endl;
    }

    return 0;
}
原文地址:https://www.cnblogs.com/GetcharZp/p/9362064.html