PAT-A1038 Recover the Smallest Number (30 point(s))

题目很简单,就是一开始不知道怎么处理,单纯排序肯定不行,但是我们可以知道,每个字符串都要有它自己的位置,那么位置怎么变化呢?如果字符串A和字符串B,如果是A+B的顺序大于B+A的顺序我们当然知道是B应该在A的前面,其实这就是排序的思想,对任意的两个字符串A和B,如果A+B大于B+A,那么B就在A前面,这就是赤裸裸的排序。

排序代码:

bool cmp(string x, string y)
{
	return x + y < y + x;
}  

  还要注意一点,就是他题目说前导0要去掉,但是如果都是0,还是要输出0的!

	while(*v[cnt].begin() == '0')
	{
		v[cnt].erase(v[cnt].begin());
		if(v[cnt].empty())
			cnt++;
		if(cnt == n)
			break;
	}

  于是乎,完整代码如下:

#include <bits/stdc++.h>
using namespace std;
vector<string> v;
bool cmp(string x, string y)
{
	return x + y < y + x;
}
int main()
{
	int n, cnt = 0;
	string temp;
	cin >> n;
	for(int i = 0; i < n; i++)
	{
		cin >> temp;
		v.push_back(temp);
	}
	sort(v.begin(), v.end(), cmp);
	while(*v[cnt].begin() == '0')
	{
		v[cnt].erase(v[cnt].begin());
		if(v[cnt].empty())
			cnt++;
		if(cnt == n)
			break;
	}
	for(int i = 0; i < n; i++)
		cout << v[i];
	if(v[v.size() - 1].empty())
		cout << 0;
	cout << endl;
	return 0;
}

  

 

 
posted @ 2021-02-14 10:54  funforever  阅读(72)  评论(0编辑  收藏  举报