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