【问题描述】
小蓝有很多数字卡片,每张卡片上都是数字 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