Problem 2088 最长队名
Accept: 319 Submit: 681
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Jack所在的班级决定组团报名参加FZU校赛。为了体现班级的团结和睦,班长决定用班级所有人的名字连起来组成一个史上最长最醒目的队名。
因为听说在分数相同的情况下,队名字典序小的会排在更前面,班长还希望连成的史上最长队名拥有最小的字典序。
Input
输入数据第一行包含一个整数T,表示测试数据的组数。对于每组测试数据:
第一行为一个整数n(0<n<=10000),表示班级成员数。
接下来n行为班级每个人的名字。名字由小写字母组成,每个人名字长度均相同。
Output
对于每组测试数据,输出一行,表示连接成的史上最长队名。
Sample Input
13jimtomjoe
Sample Output
jimjoetom
这道题目主要是考察qsort中字典序的排列,好好学学就是了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int cmd(const void* a,const void* b)
{
return *(string*)a>*(string*)b?1:*(string*)a==*(string*)b?0:-2;
}
int main()
{
string s[10010];
int t,i,j,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
cin>>s[i];
qsort(s,n,sizeof(string),cmd);
for(i=0;i<n;i++)
//printf("%s",s[i]);
cout<<s[i];
printf("\n");
}
return 0;
}
另一种方法,用strcmp
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
#include<cstring>
using namespace std;
struct In
{
char str[100];
}s[10010];
//按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(In *)a).str , (*(In *)b).str );
//return strcmp((*(In*)a)->str,(**In*)b->str);
}
//qsort(s,100,sizeof(s[0]),cmp);
int main()
{
int i,j,t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
cin>>s[i].str;
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i<n;i++)
cout<<s[i].str;
cout<<endl;
}
return 0;
}