/*
* @Author: buma
* @Date: 2022-04-05 11:14:20
* @LastEditors: buma
* @LastEditTime: 2022-04-05 11:21:05
* @Description: description
*/
// 卡片
// 问题描述:小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,
// 每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从 1 拼到多少。例如,当小蓝有 30 张卡片,
// 其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
// 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从1拼到多少?提示:建议使用计算机编程解决问题。
// 思路分析:
// 分析题目可以知道模拟整个过程即可,我们可以使用一个循环,只要可以拼出当前的数字i那么循环继续,
// 否则break输出i - 1(本来是送分题在比赛的时候不知道啥情况模拟这个过程还是算错了),使用一个方法check来检查当前数字i是否
// 可以拼出即可,使用check方法来检查会比较保险,我可能在一开始的时候没有使用方法来检查导致所有代码写在一起错了。答案为3181。
#include<stdio.h> int cnt[10]; int main() { int n=2021,i,x,k=1; for(i=0;i<10;i++)cnt[i]=n; while(1){ x=k; while(x){ if(cnt[x%10]>0)cnt[x%10]--,x/=10; else break; } if(x)break; else k++; } printf("%d",k-1); return 0; }
python
cards = [2021] * 10 # 检查当前的数字n是否是拼出来 def check(n: int): while n: t = n % 10 if cards[t] - 1 < 0: return False cards[t] -= 1 n //= 10 return True if __name__ == '__main__': i = 1 while True: if check(i): i += 1 else: print(i - 1) break