CF1250H题解
CF1250H题解
题意
现在你有 \(c_i\) 个 \(i\)(\(0\leqslant i\leqslant 9\)),问你不能拼的最小数是多少。
思路
先看数据范围:\(0\leqslant c_i\leqslant 10^5\),暴力一看就是不行的!
那我们就换一种想法:
- 若 \(0\) 的个数大于等于数字个数最少的个数:首先先设有的数字个数最少的之中最小的数为 \(i\),\(i\) 的个数为 \(cnt\),则最小不能拼的数为 \(cnt+1\) 个 \(i\)(\(i\times 10^{cnt+1}+i\))。
- 若 \(0\) 的个数小于数字个数最少的个数:设有 \(cnt\) 个 \(0\),则最小的数为 \(10^{cnt+1}\)(输出一个 \(1\),然后输出 \(cnt+1\) 个 \(0\))。
总结
- 分类讨论。
- 换行。
- 千万不能直接去算最大的数,绝对要超出数据范围(那可是 \(10^{10^5}\))。
- 一定要注意初始化。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int T;//T组数据。
int c[15],minn,cnt;
//minn记录除0以外有的个数最少的最小数。
//cnt记录这个最小数的出现个数。
int main(){
scanf("%d",&T);
while(T--){
minn=2147483647;//附上最大值。(INT_MAX)
for(int i=0; i<=9; i++){
scanf("%d",&c[i]);
if(i!=0&&minn>c[i]){//记录。
minn=c[i];
cnt=i;
}
//"minn>c[i]"不可以写>=因为是要取有的个数最少的最小数,加了'='则变成了求有的个数最少的最大数。
}
if(minn>c[0]){//特殊情况:0的个数最少。
printf("1");
for(int i=1; i<=c[0]+1; i++) printf("0");
}
else for(int i=1; i<=minn+1; i++) printf("%d",cnt);//记得cnt要加1
printf("\n");//一定要记得换行!
}
return 0;
}

浙公网安备 33010602011771号