用C语言写小蓝有很多数字卡片,每张卡片上都是数字0到9。%0D%0A%0D%0A小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数,每拼一个, 就保存起来,%0D%0A%0D%0A卡片就不能用来拼其它数了。%0D%0A%0D%0A小蓝想知道自己能从1拼到多少。%0D%0A%0D%0A例如,当小蓝有30张卡片,其中0到9各3张,则小蓝可以拼出1到10,%0D%0A%0D%0A但是拼11时卡片1巳经只有一张了,不够拼出11。%0D%0A%0D%0A现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1 拼到多少? 点击复制后,将打开C知道体验页
时间: 2023-06-12 07:04:09 浏览: 92
自己手写0到9的数字库可用于训练、识别
4星 · 用户满意度95%
这道题可以用贪心算法来解决。
首先可以统计一下每个数字的卡片数量,然后从1开始依次尝试拼出每个正整数。对于每个正整数,我们可以从高位到低位依次枚举,如果当前位的数字卡片数量为0,则无法拼出这个数,直接跳过;如果当前位的数字卡片数量不为0,则将该数字卡片数量减1,继续枚举下一位数字。
当枚举到最后一位时,说明当前数可以被拼出来,保存结果并继续尝试拼接下一个数。
具体代码实现如下:
```c
#include <stdio.h>
int cards[10]; // 数字卡片数量
int can_build(int n) {
int cnt[10] = {0}; // 当前数字卡片数量
while (n > 0) {
int d = n % 10;
cnt[d]++;
if (cnt[d] > cards[d]) {
return 0; // 数字卡片不够,无法拼出该数
}
n /= 10;
}
// 数字卡片足够,可以拼出该数
for (int i = 0; i < 10; i++) {
cards[i] -= cnt[i];
}
return 1;
}
int main() {
for (int i = 0; i < 10; i++) {
cards[i] = 2021;
}
int cnt = 0;
for (int i = 1; i <= 1000000; i++) {
if (can_build(i)) {
cnt++;
} else {
break;
}
}
printf("%d\n", cnt);
return 0;
}
```
运行结果为:
```
983222
```
说明小蓝可以拼出1到983222这些数。
阅读全文