直接分类讨论情况即可
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 25;
int n;
//比较函数1 比情况3
bool judge(vector<int> a,vector<int> b,int len)
{
for(int i = 0 ; i < len ; i ++)
if(a[i] != b[i]) return true;
return false;
}
//比较函数2 比情况4
bool compare(vector<int> a,vector<int> b)
{
int len = min(a.size(),b.size());
if(len == a.size())
return a[0] > b[len];
else return b[0] > a[len];
}
//结构体存输入的数,用重载运算符来排序
struct Num
{
vector<int> a;
int f,len;
bool operator< (const Num &W)const
{
//情况1
if(f != W.f) return f > W.f;
//情况2
if(len == W.len) return a > W.a;
//情况3
if(len != W.len && judge(a,W.a,min(len,W.len))) return a > W.a;
//情况4
if(compare(a,W.a)) return a < W.a;
return a > W.a;
}
}num[N];
int main()
{
//处理输入
scanf("%d",&n);
for(int i = 0 ; i < n ; i ++)
{
int b; //输入的数
vector<int> c; //把数存到vector
scanf("%d",&b);
while(b)//取出每一位
{
c.push_back(b%10);//存到vector里
b /= 10;
}
reverse(c.begin(),c.end()); //vector里是反的数,反转成正
int f = c[0];//首字母
int len = c.size();//长度
num[i] = {c,f,len};//存入数组
}
//****上面所有都是为了一步sort得到答案****
sort(num,num + n);
//输出即可
vector<int> res;
for(int i = 0 ; i < n ; i ++)
{
for(int j = 0 ; j < num[i].a.size() ; j ++)
res.push_back(num[i].a[j]);
}
for(auto d : res)
printf("%d",d);
return 0;
}