牛客小白月赛4 20180616B

题目描述

铁子和顺溜在学习了博弈论的sg函数之后,解决了很多很多博弈题,现在他们遇到了一道难题。给出一个长度为 n 的数列,数列里的每个元素都是个位数,这个数列的每一个连续子数列都能生成,一个十进制数,对于子数列a[l~r],这个十进制数的个位为a[r],十位为a[r - 1],…,最高位,为a[l]。现在铁子需要知道最小的不能被该数列的子数列生成的十进制非负整数是多少?
输入描述:
第一行一个数字n。(1 ≤ n ≤ 1000),第二行n个数字di。(0 ≤ di ≤ 9)
输出描述:
输出一个数字表示答案。

分析

骗分大法好,这道题看上去不可做,但可以骗过去,因为n≤1000,所以它不可能组尽1e6以内的所有数字,所以暴力处理出1e6内可组成的数字,这样就可找出组不成的最小数字,时间:8ms。
上代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int al[1001],bj[1000000],n;
int main(){
    scanf("%d",&n);
    memset(bj,0,sizeof(bj));
    for(int i=1;i<=n;i++) scanf("%d",&al[i]),bj[al[i]]=1;
    for(int i=2;i<=n;i++) bj[10*al[i-1]+al[i]]=1;
    for(int i=3;i<=n;i++) bj[100*al[i-2]+10*al[i-1]+al[i]]=1;
    for(int i=4;i<=n;i++) bj[1000*al[i-3]+100*al[i-2]+10*al[i-1]+al[i]]=1;
    for(int i=5;i<=n;i++) bj[10000*al[i-4]+1000*al[i-3]+100*al[i-2]+10*al[i-1]+al[i]]=1;
    for(int i=6;i<=n;i++) bj[100000*al[i-5]+10000*al[i-4]+1000*al[i-3]+100*al[i-2]+10*al[i-1]+al[i]]=1;
    for(int i=0;i<=1e6;i++)
        if(!bj[i]){
            printf("%d\n",i);
            return 0;
        }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sjzezwzy/article/details/80715255