蓝桥杯2021年 第十二届 卡牌

问题遇到的现象和发生背景

个人想法是,从1到n,不断遍历,并把每一个数字拆成好几个字符相连,建立一个数组,分别存储0~9,每出现一次,数组相应位置减一

img

问题相关代码,请勿粘贴截图
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
    int c=0;
int a[10]={2021,2021,2021,2021,2021,2021,2021,2021,2021,2021};
bool check(int i)
{

    int y=10;
    string str=to_string(i);
    int j;

    
    for(j=0;j<str.size();j++)
    {
        if(str[j]==0)
        a[0]--;
            if(str[j]==1)
        a[1]--;
            if(str[j]==2)
        a[2]--;
            if(str[j]==3)
        a[3]--;
            if(str[j]==4)
        a[4]--;
            if(str[j]==5)
        a[5]--;
            if(str[j]==6)
        a[6]--;
            if(str[j]==7)
        a[7]--;
            if(str[j]==8)
        a[8]--;
            if(str[j]==9)
        a[9]--;
    }

    for(j=0;j<10;j++)
    {
    
        if(a[j]<=0)
        {
            break;
    }
        y--;}
    if(y>0){
    
        return false;
    }
    
return true;

    
 } 

 
 int main()
 {
 
     int i;
 for(i=1;i<20210;i++)
 {

     if(check(i)==false)
     {
             
             break;
     }
     c++;
 }
 printf("%d",c);
 
     return 0;
 }
运行结果及报错内容

运行结果是0,不知道问题出在了哪里

分析题目可以知道模拟整个过程即可,我们可以使用一个循环,只要可以拼出当前的数字i那么循环继续,否则break输出i - 1(本来是送分题在比赛的时候不知道啥情况模拟这个过程还是算错了),使用一个方法check来检查当前数字i是否可以拼出即可,使用check方法来检查会比较保险,我可能在一开始的时候没有使用方法来检查导致所有代码写在一起错了。答案为3181。