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; }