string類 sort Educational Codeforces Round 9 C. The Smallest String Concatenation

題意:給1<=n<=5*10^4個長度1<=|ai|<=50的字符串,將他們拼接成一個,輸出字典序最小的

1)話說此題費了一番周折,也做出來了,然後發現自己的代碼比宦豪和帆神的都長好多,發現自己應該好好學學String類了,確實比char數組好用好多~~

2)此題用char數組做的時候,要對char二維數組進行快排sort,百度了一下,應該是隻能用結構體

typedef struct node{
    char str[55];
}node;
node ma[N];
然後對此結構體進行排序,但要是用string類的話就不用這樣了,直接開一個string 的一維數組就可以了
string str[MAXN];

3)sort排序是cmp函數是bool型,而不是int型,這個也竟然卡了一下

順便記錄一下sort的cmp函數

#include<algorithm>        using namespace std;

sort(a,a+n,cmp);對a[0]到a[n-1]排序,cmp不寫默認升序,從小到大

經典的greater<type>()和less<type>():

int a[10]={1,4,3,2,5,9,56,7,9,4};
int main()
{
    int i,j;
    sort(a,a+10,less<int>());//從小到大,升序
    sort(a,a+10,greater<int>());//從大到小,降序
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
        putchar('\n');
    return 0;
}

int型,char型,double型都可以,結構體類似:

int maint[1000];
bool cmpint(int a,int b){
    return a<b;//升序排列,從小到大
}

二維數組a[1000][2]按照a[][0]升序排列

可悲的是sort不支持二維數組,開結構體吧


本題我的代碼:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#define mem(a) memset(a,0,sizeof(a))
typedef long long ll;
#define N 50050
using namespace std;
typedef struct node{
    char str[55];
}node;
node ma[N];
int n;

bool comp(node a,node b){
    if(a.str[0]!=b.str[0]){
        return a.str[0]<b.str[0];
    }
    else {
        int la=strlen(a.str),lb=strlen(b.str);
        int i,j,l;
        l=min(la,lb);
        for(i=0;i<l;i++){
            if(a.str[i]!=b.str[i])
                return a.str[i]<b.str[i];
        }
        char a1[110],b1[110];
        for(i=0;i<la;i++)
            a1[i]=a.str[i];
        for(i=la;i<la+lb;i++)
            a1[i]=b.str[i-la];
        a1[la+lb]='\0';
        for(i=0;i<lb;i++)
            b1[i]=b.str[i];
        for(i=lb;i<la+lb;i++)
            b1[i]=a.str[i-lb];
        b1[la+lb]='\0';
        int tmp=strcmp(a1,b1);
        if(tmp==0)return 0;
        else if(tmp>0)return 0;
        else return 1;
    }
}

int main()
{
    int i,j;
    while(scanf("%d",&n)){
        for(i=0;i<n;i++)
            scanf("%s",ma[i].str);
        sort(ma,ma+n,comp);
        for(i=0;i<n;i++){
                int tmp=strlen(ma[i].str);
            for(j=0;j<tmp;j++){
                printf("%c",ma[i].str[j]);
            }
        }
        putchar('\n');
    }
    return 0;
}

看一下q神簡潔的代碼:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=50005;
string str[MAXN];
bool cmp(string a,string b)
{
    return a+b<b+a;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>str[i];
    sort(str,str+n,cmp);
    for(int i=0;i<n;i++)
        cout<<str[i];
    return 0;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章