牛客小白月赛4 B - 博弈论(字符串)

链接:https://www.nowcoder.com/acm/contest/134/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 262144K,其他语言524288K

64bit IO Format: %lld

题目描述

铁子和顺溜在学习了博弈论的sg函数之后,解决了很多很多博弈题,现在他们遇到了一道难题。

给出一个长度为 n 的数列,数列里的每个元素都是个位数,这个数列的每一个连续子数列都能生成

一个十进制数,对于子数列a[l~r],这个十进制数的个位为a[r],十位为a[r – 1],…,最高位

为a[l]。

现在铁子需要知道最小的不能被该数列的子数列生成的十进制非负整数是多少?

输入描述:

第一行一个数字n。(1 ≤ n ≤ 1000)
第二行n个数字di。(0 ≤ di ≤ 9)

输出描述:

输出一个数字表示答案。

示例1

输入

复制

4
3 0 1 2

输出

复制

4

示例2

输入

复制

10
9 8 7 6 5 4 3 2 1 0

输出

复制

11

记录一个新学的函数

strstr(s1,s2);

s1 为主串,s2为子串,返回值为s2在s1中第一次出现的首地址。如果s1 中未能成功匹配s2,则返回NULL

#include<bits/stdc++.h>
using namespace std;

const int MAX = 1e5+10;

int n;
char s[MAX];
char str[MAX];
int temp[MAX];
void change(int n){
    int t=n;
    int num=0;
    memset(str,0,sizeof(str));
    memset(temp,0,sizeof(temp));
    if(t==0){
        str[0] = '0';return;
    }
    while(t){
        temp[num++] = t%10;
        t/=10;
    }
    for(int i=0;i<num;i++){
        if(temp[num-i-1]==0)	str[i] ='0';
        else if(temp[num-i-1]==1)str[i] ='1';
        else if(temp[num-i-1]==2)str[i] ='2';
        else if(temp[num-i-1]==3)str[i] ='3';
        else if(temp[num-i-1]==4)str[i] ='4';
        else if(temp[num-i-1]==5)str[i] ='5';
        else if(temp[num-i-1]==6)str[i] ='6';
        else if(temp[num-i-1]==7)str[i] ='7';
        else if(temp[num-i-1]==8)str[i] ='8';
        else if(temp[num-i-1]==9)str[i] ='9';
        else if(temp[num-i-1]==9)str[i]='0';
    }
}
int main(){
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n-1;i++){
        scanf("%c ",&s[i]);
    }
    scanf("%c",&s[n-1]);
    for(int i=0;;i++){
        change(i);
        if(!strstr(s,str)){
            printf("%d\n",i);
            break;
        }
    }
    return 0;
}

    原文作者:B树
    原文地址: https://blog.csdn.net/l18339702017/article/details/80725720
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞