《卡片》真题练习

时间:2022-2-27    作者:老大夫    分类: 《蓝桥杯省赛真题解析》2021 年第十二届 C++ B组


转载自:https://www.lanqiao.cn/courses/5485
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少? 提示:建议使用计算机编程解决问题

运行限制
最大运行时间:1s
最大运行内存: 128M

解题思路
比较容易的模拟,我们从 1 开始枚举, 每次检查剩下的卡片能不能拼出这个数字就好。

我们是怎么把一个数在 10 进制下每个位置的数字求出来呢?很简单对吧,先 对 10 取模,个位上的数字就求出来了,再除以 10 ,原本十位上的数字就变到了个位上,再对 10 取模...依次进行下去就求出来了。把当前拼的这个数每一位都拆出来,看看那个数字的卡片还够不够,不够的话就说明拼不了,这时候退出循环,所以最多拼到上一个数。

最终答案:3181。

#include<bits/stdc++.h>
using namespace std;
//存放卡片的数组
int num[10];

int main(){
    //每个数字存量2021张
    for(int i=0;i<=9;i++){
        num[i]=2021;
    }
    // 从1开始拼数字
    for(int i=1;true;i++){
        // 设置一个临时temp变量
        int temp=i;
        // 该数字完全拼出后结束该数字的循环
        while(temp){
            //先从每个数字的个位开始拼
            num[temp%10]--;
            //如果哪一种数字卡片用光了就停止程序,输出最后在拼接的数字
            if(num[temp%10]==0){
                cout << i;
                return 0;
            }
            temp/=10;
        }
    }
}


扫描二维码,在手机上阅读

推荐阅读: