例题:
给定N个非负整数,现需要将他们重新排列并拼接,使得最后的结果最大,输出这个结果。 注意不能简单比大小进行拼接,比如321和32,显然32放前面结果(32321)会更大。
18963 最大数字
输入格式
第一行一个整数N。(1<=N<=1000) 第二行N个非负整数,每个整数值不大于1000。
输出格式
拼接后的最大整数。
输入样例
2 321 32
输出样例
32321
#include<iostream>
#include<algorithm>
#include<sstream>
#include<math.h>
#include<vector>
#include<queue>
#include<list>
#include<map>
#include<set>
#include<string>
#include<stdio.h>
#include<ctype.h>
#include<cstring>
#include<cstdlib>
#include<iomanip>
using namespace std;
struct cmp
{
bool operator () (const string& p, const string& p1)
{
if (p[0] != p1[0])
{
return p[0] > p1[0];
}
else
{
if(p>p1) return p[p.size() - 1] > p1[0];
else
{
return p1[p1.size() - 1] < p[0];
//这里表明如果不要交换位置,返回真,否则返回假
}
}
}
};
vector<string>v;
int main()
{
freopen("in.txt", "r", stdin);
ios::sync_with_stdio(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
string s;
cin >> s;
v.push_back(s);
}
sort(v.begin(), v.end(), cmp());
string s;
for (int i = 0; i < v.size(); i++)
{
s += v[i];
}
cout << s;
}
标程:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
string s[1005];
int cmp(string s1,string s2)
{
return s1+s2>s2+s1;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
int n,i,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>s[i];
sort(s+1,s+n+1,cmp);
for(i=1;i<=n;i++)
cout<<s[i];
return 0;
}