★实验任务
一群小孩子在玩游戏,游戏规则是这样子,给了一些卡片,上面有数字,现在要把卡片按照某一种序列排好,让这些数字重新链接组合成一个大数,求最大的数是什么。
★数据输入
第一行一个整数N
接下来N行,每行一个整数ai,为第i张卡片上的数值。(0<=ai<=100)
50%数据 1<=N<=50000
100%数据1<=N<=100000
★数据输出
输出重新组合好的大数。
输入示例
3
99
23
99
输出示例
999923
(本题用到了桶排序的思想)
#include<stdio.h>
int main(void){
int a[101] = {0}; //创建101个桶,每个桶存储该编号出现的次数
int i,N,k,j;
/* 获取输入 */
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&k);
a[k]++;
}
for(i=9;i>=1;i--){ //最外层循环十位数字
/* 先把各位数字大于十位数字的桶里的元素倒出来 */
for(j = 9;j>=i;j--){
while(a[i*10+j]--)
printf("%d",i*10+j);
}
/* 把1~9的桶中与当前十位数相同的桶中的元素倒出,如输出完桶[99]的元素后,若桶[9]有元素就把桶[9]的元素输出 */
while(a[j+1]--)
printf("%d",j+1);
/* 输出以当前外循环数 i 为十位数的剩余桶中的元素 */
while(j){
while(a[i*10+j]--)
printf("%d",i*10+j);
j--;
}
while(a[i*10]--) //倒出相应的整十数的桶里的元素,如 70,80,等等
printf("%d",i*10);
}
/* 桶[100]与桶[0]的元素最后倒出 */
while(a[100]--) printf("100"); //100
while(a[0]--) printf("0");
return 0;
}
本文介绍了一个有趣的算法问题:通过合理排序带有数字的卡片来形成最大可能的数值。使用桶排序的方法进行解决,通过创建多个桶来存储不同数值的卡片,并按照特定顺序输出以得到最大组合数。
1411

被折叠的 条评论
为什么被折叠?



