这个题我做的时候按自己的想法,对cmp下手,然后重新赋值排序。
第一次提交两个测试点没过,很容易想到测试点2是答案为0,你把前导0去除以后,字符串为空,特判就可以解决。
其次是测试点5,这个其实很有意思,如
34
341
3413
应该让3413排在最前面,我判断的方法是补充首元素,补充后如下:
34 33
341 3
3413
斜体为补充字符,按最长字符串补充
不可以直接按补充后的字符串排序!
上面的三个是相等的,但是实际上并不是这样
我的cmp函数如下:
bool cmp(string&a, string&b) {
string aa=a, bb=b;
int len = max(a.size(), b.size());
aa.insert(aa.end(), len - a.length(), aa[0]);
bb.insert(bb.end(), len - b.length(), bb[0]);
return aa == bb?a.length()>b.length():aa<bb;
}
这样就可以完美排序了。
当然其实我在做这个题的想起来最开始是借鉴的大神们的cmp函数,直接这样一怼就完事了:
bool cmp(string&a, string&b) {
return a + b < b + a;
}
高级,高级。
本人AC代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(string&a, string&b) {
int len = max(a.size(), b.size());
string aa=a, bb=b;
aa.insert(aa.end(), len - a.length(), aa[0]);
bb.insert(bb.end(), len - b.length(), bb[0]);
return aa == bb?a.length()>b.length():aa<bb;
}
int main() {
int N;
string ans;
scanf("%d", &N);
vector<string> s(N);
for (int i = 0; i < N; i++) {
cin >> s[i];
}
sort(s.begin(), s.end(), cmp);
for (int i = 0; i < s.size(); i++)ans += s[i];
while (ans[0] == '0')ans.erase(ans.begin());
if (ans.size() ==0 )ans = "0";
printf("%s", ans.c_str());
return 0;
}