[蓝桥杯练习]题目:卡片

文章讲述了小蓝用2021张0-9的数字卡片从1开始拼数,直至某数无法再拼出时停止。通过编程实现,首先遍历所有可能的数,每次消耗对应位的卡片,当某个位的卡片数量减少到零时结束。优化方法注意到1会先消耗完,只需关注1的剩余数量。
摘要由CSDN通过智能技术生成

【问题描述】

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

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

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

例如,当小蓝有 30张卡片,其中0到9各3张,则小蓝可以拼出1到10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。

现在小蓝手里有 0 到9的卡片各 2021 张,共 20210 张,请问小蓝可以从 1拼到多少?

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

解题思路:

 将0~9设置成数组下标,赋值a[0]~a[9]=2021,枚举拼出来的数组,拆解每一位,对应的数字的计数减一,当每个数字的计数数量小于0时,代表当前i无法拼出,输出上一次拼出来的数i-1即可

解题代码:

#include <iostream>
using namespace std;
const int N = 10;
int a[N];
int main() {
	for (int i = 0; i <= 9; i++) {
		a[i] = 2021;
	}
	int t;
	for (int i = 1;; i++) {
		t = i;
		while (t) {
			a[t % 10]--;
			if (a[t % 10] < 0) {
				cout << i - 1 << endl;
				return 0;
			}
			t /= 10;
		}
	}
	return 0;
}

优化:

         由上述解法,我们可以得知在进行组合时,1始终是优先消耗的,1一定会优先消耗完毕,所以我们只需要考虑消耗1的数量即可。

优化代码:

int main() {
	int s = 2021;
	for (int i = 1;; i++) {
		int t = i;
		while (t) {
			if (t % 10 == 1)s--;
			if (s < 0) {
				cout << i - 1 << endl;
				return 0;
			}
			t /= 10;
		}
	}
	return 0;
}

答案为3181

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值