蓝桥杯三天备考----枚举:卡片

发布时间 2023-04-05 11:44:05作者: 东西弗里

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝有很多数字卡片,每张卡片上都是数字 0到 9。

小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。

小蓝想知道自己能从 1 拼到多少。

例如,当小蓝有 3030 张卡片,其中 00 到 99 各 33 张,则小蓝可以拼出 11 到 1010,

但是拼 1111 时卡片 11 已经只有一张了,不够拼出 1111。

现在小蓝手里有 00 到 99 的卡片各 20212021 张,共 2021020210 张,请问小蓝可以从 11 拼到多少?

提示:建议使用计算机编程解决问题。

解题思路:

建立一个从零到九的数组,每个数组大小为从零到九每种卡牌的数量,从一开始遍历,看每一位数字如果卡牌数量充足,就减一看下一位,直到遍历完整个数字,再看下一位数字,终止条件是当某一位数字的卡牌数量为零的时候,说明现有的卡牌数量已经拼不出这个数字了,输出上一位数字,因为题目要就是能够拼成的最大数字。

ps:一开始我不知道最大能拼出多大的数,后来发现如果拼出的最大数比循环上限高,则没有输出,低就有输出,也是一种解决方法。

#include<iostream>
#include<algorithm>
using namespace std;
int n,m,num[10];
int main(){
    for(int i = 0;i <=9;i ++){
        num[i] = 2021;
    }
    for(int i = 1;i <= 999999;i ++)
    {
        int t = i;
        while(t)
        {
            if(num[t%10] == 0)
            {
                cout << i -1;
                return 0;
            }
            num[t%10] --;
            t/=10;
        }
    }
    cout << 0;
    return 0;
    
}