题目:P1012 [NOIP1998 提高组] 拼数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
string a[21];
int n;
bool cmp(const string &a,const string &b){
return a+b > b+a;
}
signed main(){
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
cout<<a[i];
}
cout<<endl;
return 0;
}
从这道题学到的:
- 对字符串输出大小的判断的理解:
对贪心正确性的证明:(对比较函数的理解)
分析可见两同样长字符串 s1,s2,若 s1 比 s2 大,必有 x 使得 s1 在 x 位第一次比 s2 大 。
说明只要前面的位大,就可以忽略后面的位,可以使用贪心解决,把对字典序贡献最大的放在前面。比较方法只要比较 s1+s2 和 s2+s1 的大小即可。
如:22 和 1919 ,比较 22 和 1919 哪个放在前面使字典序最大,也就是即比较 219219 和 192192 哪个大,因为 219219 比 192192 大,所以把 22 放在 1919 前面