CF1250H题解

CF1250H题解

题意

现在你有 \(c_i\)\(i\)\(0\leqslant i\leqslant 9\)),问你不能拼的最小数是多少。

思路

先看数据范围:\(0\leqslant c_i\leqslant 10^5\),暴力一看就是不行的!

那我们就换一种想法:

  1. \(0\) 的个数大于等于数字个数最少的个数:首先先设有的数字个数最少的之中最小的数为 \(i\)\(i\) 的个数为 \(cnt\),则最小不能拼的数为 \(cnt+1\)\(i\)\(i\times 10^{cnt+1}+i\))。
  2. \(0\) 的个数小于数字个数最少的个数:设有 \(cnt\)\(0\),则最小的数为 \(10^{cnt+1}\)(输出一个 \(1\),然后输出 \(cnt+1\)\(0\))。

总结

  1. 分类讨论。
  2. 换行。
  3. 千万不能直接去算最大的数,绝对要超出数据范围(那可是 \(10^{10^5}\))。
  4. 一定要注意初始化。

代码

#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;
}
posted @ 2025-01-29 15:28  naroto2022  阅读(21)  评论(0)    收藏  举报