蓝桥杯典型真题分析详解--编程思维--卡片

2021年省赛-填空题

C/C++ A组第1题;C/C++ B组第2题

JavaB组第2题;JavaC组第3题

Python组第1题

【问题描述】

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

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果作为一个整数,在提交答案时只填写这个整数,填写多余的内 容将无法得分。

这些题目,大家可能不理解,我句一些例子

卡片可以用来拼凑数字,假设小蓝拥有刻有数字1和数字2的卡片各一张,那么他可以利用这两张卡片拼凑出数字1,2,12,21这4个正整数。如果有数字1,2,3的卡片各,两张,那么他可以利用这两张卡片拼凑出数字1,2,3,12,

【考点】

枚举  模拟

【分析】

直接从数字1开始往后枚举,枚举的同时检查剩下的卡片能不能拼出当前枚举到的数字。

很容易可以想到数组,下标代表卡片数字,定义数组cnt[i],按照题目的意思,初始化cnt[0∼9]= 2021

参考代码

int cnt[10];
for(int i=0;i<=9;i++)
cnt[i]=2021;

若我们将步骤拆分为两步,则可分为枚举,即循环

然后是检查,但该怎么检查呢?

首先就需要把一个数在十进制下的每一位数字求出来。可以将该数对10取模,得到数位上的所有数字后再看看这些数字对应的卡片够不够,不够的话就说明这个数拼不了,就停止枚举,这样答案就为上一个枚举的数。

参考代码

bool check(int x)
{
    while(x)//当前枚举数
    {
        int b=x%10;//循环取每个数
        if(cnt[b]>0)
        cnt[b]--;//对应数的卡片数减1
        else return false;//如果卡片数不足,返回false,结果为上一个数
        x/=10;
    }
    return true;//如果所有数的卡片数都足够,返回true
}

至此,检查的模块就完成了。不过我们还可以进行一点小小的优化。刻有数字1的卡片一定会被最早使用完,我们只需要对该卡片的张数作判断就好,具体代码可见参考代码第4∼14行。

#include
using namespace std;
int cnt[10];
bool check(int x)
{
    while(x)
    {
        int b=x%10;
        if(b==1)
        {       
        if(cnt[1]==0)
        return false;
        cnt[1]--;
        }
        x/=10;
    }
    return true;
}
signed main()
{
for(int i=0;i<=9;i++)
cnt[i]=2021;
for(i=1;;i++)
{
    if(!check(i))
    return cout<

最终答案为3181

你可能感兴趣的:(c++蓝桥杯冲刺特训,蓝桥杯,c++,c语言,算法,开发语言,数据结构)