1023 组个最小数——20分
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。现给定数字,请编写程序输出能够组成的最小的数。
输入格式
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥
有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式
在一行中输出能够组成的最小的数。
输入样例
2 2 0 0 0 3 0 0 1 0
输出样例
10015558
| 代码长度限制 | 时间限制 ||内存限制 |
|16 KB | 200 ms | 64 MB |
思路:
①每次固定输入十个数,并不是让你拿这十个数去组数字,而是分别代表0 ~ 9中相应数字出现的次数
②我们接下来根据输入可以按从小到大的顺序将所有的数字存入vector中
③如果第一位不是0,说明没有0,直接输出vector中数字即可得到最小数,如果是第一位是0的话,需要将这个0和后面第一个不是0的数字进行交换,然后再输出全部数字即可
思路:
#include<bits/stdtr1c++.h>
using namespace std;
int main() {
int a[10];
vector<int> v;
int t;
for (int i = 0; i < 10; i++) {
cin >> t;
a[i] = t; //用数组进行存储,数组的下标正好是0~9,每次的t代表它们出现的次数
}
for (int i = 0; i <= 9; i++) { //按0~9的顺序来,保证小的在前面
for (int j = 1; j <= a[i]; j++) { //根据数组中的值判断每个数字出现了多少次
v.emplace_back(i);
}
}
if (v[0] != 0) {
for (auto x : v) cout << x; //开头不为0直接输出
} else {
swap(v[0], v[0 + a[0]]); //开头为0的话,先和第一个不为0的数交换一下
for (auto x : v) cout << x; //直接输出
}
return 0;
}

浙公网安备 33010602011771号