给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。 现给定数字,请编写程序输出能够组成的最小的数。 输入格式: 输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。 输出格式: 在一行中输出能够组成的最小的数。
时间: 2023-05-31 13:19:04 浏览: 329
2、省选+NOI-第二部分 字符串_2020.09.04.pdf
### 回答1:
思路:贪心算法,将数字按照从小到大的顺序排列,然后从非0数字开始拼接,最后再将0拼接在最后。
代码如下:
num_list = list(map(int, input().split())) # 输入数字个数
# 将数字按照从小到大的顺序排列
num_order = []
for i in range(10):
for j in range(num_list[i]):
num_order.append(str(i))
# 从非0数字开始拼接
res = ''
for i in range(len(num_order)):
if num_order[i] != '0':
res += num_order[i]
num_order[i] = '' # 已经使用过的数字标记为空
# 最后再将0拼接在最后
res += ''.join(num_order)
print(res) # 输出结果
### 回答2:
解题思路:
本题需要求取给定数字能组成的最小数,那么我们可以从小到大遍历给定数字,依次添加到结果中,但是需要注意以下几点:
- 如果给定数字中没有 0,则结果的首位一定不是 0。
- 如果给定数字中存在 0,则需要先将 0 添加到结果中,此时需要注意后面不能再添加 0,因为 0 除了首位外不能出现在其它位置。
- 先添加小的数字能保证最终的结果最小。
因此,我们可以先统计出数字 0-9 出现的次数,然后根据以上思路依次添加数字,最终得到最小的数。
参考代码:
### 回答3:
这是一道典型的贪心算法的题目。
首先根据0~9数字的出现次数,我们可以得到数字组成的情况,然后我们需要按照最小的规则来排列数字。
我们先将非0的最小数字作为开头,然后将剩余的数字从小到大排列,最后将0插入到排列好的数字中,使得0出现在最后。
具体实现过程如下:
1. 读入数字出现的次数,保存在数组a[10]中。
2. 找到非0的最小数字i,并将其输出,并将a[i]的数值减1。
3. 将余下的数字从小到大排列并输出。
4. 将0插入到排列好的数字中,使得0出现在最后。
代码实现如下:
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int main()
{
for(int i=0; i<10; i++)
cin >> a[i];
int i=1;
while(a[i]==0) i++; //找到非0的最小数字
cout << i;
a[i]--;
for(int j=0; j<10; j++)
for(int k=0; k<a[j]; k++)
cout << j;
cout << endl;
return 0;
}
阅读全文