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;
}
posted @ 2022-08-10 01:12  Fare-Well  阅读(35)  评论(0)    收藏  举报