P1012 拼数 字符串

题目描述

设有nn个正整数(n≤20)(n20),将它们联接成一排,组成一个最大的多位整数。

例如:n=3n=3时,33个整数1313,312312,343343联接成的最大整数为:3433121334331213

又如:n=4n=4时,44个整数77,1313,44,246246联接成的最大整数为:74246137424613

输入输出格式

输入格式:

第一行,一个正整数nn。

第二行,nn个正整数。

输出格式:

一个正整数,表示最大的整数

输入输出样例

输入样例#1: 复制
3
13 312 343
输出样例#1: 复制
34331213

字符串交水的题
一开始cmp考虑了半天a了
#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define inf 0x3f3f3f3f
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////

bool cmp(string a,string b)
{
    int lena=a.size();
    int lenb=b.size();
    int i;
    for( i=0;i<min(lena,lenb);i++)
        if(a[i]!=b[i])break;
    if(i!=min(lena,lenb))
        return a[i]>b[i];
    else
    {
        if(lena>lenb)
            return a[ min(lena,lenb) ]>a[0];
        else if(lena<lenb)
            return b[0]>b[min(lena,lenb)];
    }
}
int main()
{
    string s[30];
    int n;
    RI(n);
    rep(i,1,n)
    cin>>s[i];
    sort(s+1,s+1+n,cmp);
    rep(i,1,n)
    cout<<s[i];
    return 0;
}
View Code

但是可以直接加起来进行比较

#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define inf 0x3f3f3f3f
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////

bool cmp(string a,string b)
{
    return a+b>b+a;
}
int main()
{
    string s[30];
    int n;
    RI(n);
    rep(i,1,n)
    cin>>s[i];
    sort(s+1,s+1+n,cmp);
    rep(i,1,n)
    cout<<s[i];
    return 0;
}
View Code

真是智商是硬伤





原文地址:https://www.cnblogs.com/bxd123/p/10661449.html