上一期刷题活动——「算法学与练」从 5 月进行到了 9 月初,已于上周四圆满结束。
为了迎接新一届蓝桥杯,我替大家整理了蓝桥杯历年真题,不知道小伙伴们是否开始做准备了呢?本次刷题将会贯穿整个蓝桥杯备赛季,想要提前抢跑,备战蓝桥杯的小伙伴们,一定要抓紧加入啦!
我们与你一起同行,并肩冲击蓝桥杯国一!(小声说:之后每天会有历年真题刷题,记得来领真题奥~)
今天是「每日一题——蓝桥杯夺奖冲刺」刷题的第一天,题目为:卡片。
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少? (提示:建议使用计算机编程解决问题)
本题涉及知识点为 枚举&模拟,并出现在第 12 届蓝桥杯软件类 C/C++ A/B 组、Java B/C 组和 Python 组。
比较容易的模拟,我们从 1 开始枚举, 每次检查剩下的卡片能不能拼出这个数字就好。
我们是怎么把一个数在 10 进制下每个位置的数字求出来呢?
很简单对吧,先对 10 取模,个位上的数字就求出来了,再除以 10 ,原本十位上的数字就变到了个位上,再对 10 取模...依次进行下去就求出来了。
把当前拼的这个数每一位都拆出来,看看那个数字的卡片还够不够,不够的话就说明拼不了,这时候退出循环,所以最多拼到上一个数。
1.Java
public class Main {
static int[] num = {2021,2021,2021,2021,2021,2021,2021,2021,2021,2021};
static int check(int x){
while(x > 0){
int now = x % 10;
if(num[now] > 0) num[now]--;
else return 0;
x /= 10;
}
return 1;
}
public static void main(String[] args) {
for(int i = 1;;i++){
if(check(i) == 0){
System.out.println(i - 1);
break;
}
}
}
}
Python
a = [2021 for i in range(10)]
def check(x):
while(x > 0):
now = int(x % 10)
if(a[now] > 0):
a[now] -= 1
else:
return 0
x = x // 10
return 1
cnt = 1
while(check(cnt)):
cnt += 1
print(cnt - 1)
C/C++
using namespace std;
typedef long long ll;
int num[10];
bool check(int x){
while(x){
int now = x % 10;
if(num[now] > 0) num[now]--;
else return false;
x /= 10;
}
return true;
}
int main()
{
for(int i = 0;i < 10;i++) num[i] = 2021;
for(int i = 1;;i++){
if(!check(i)){
cout << i - 1 << endl;
break;
}
}
return 0;
}
今天的「每日一题」就结束啦~第 14 届蓝桥杯备赛的小伙伴,快来一起刷题吧~
▼加入蓝桥杯备赛刷题▼
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...