题目描述
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:
给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入描述
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空
格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
思路:
这个题目没有难点,输入序列相当于已经给出排序后的数字
只要对第0个数字更新的时候进行特殊处理即可
其他位的数字只要从头开始扫描然后装入即可
#include<iostream>
using namespace std;
int counter[10];//输入数组
int length = 0;//统计数字个数,动态生成输出数组
int find_next_min_num(int loc)
{//找到可供装入的下一个最小数字
int start = 0;
if(loc == 0)
{
start = 1;
}
for(;start<10;++start)
{
if(counter[start] > 0)//当前数字start还有剩余个数供装入到结果数组
{
--counter[start];
return start;
}
}
return -1;
}
int main()
{
for(int i=0;i<10;++i)
{
cin>>counter[i];
length += counter[i];//统计有效数字个数
}
int* output = new int[length];//输出数组
for(int i=0; i<length;++i)
{
output[i] = find_next_min_num(i);
cout<<output[i];
}
cout<<endl;
delete[] output;
return 0;
}