UVa 10905 - Children's Game

29 篇文章 0 订阅

题目不难,就是凑最大数,不过qsort得特殊处理一下,两个数字字符串交换位置比较一下,取较大的情况,记得数组开大点,太小了也是WA ~

代码如下:

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
int n_cmp(const void *a,const void *b)
{
    char* _a=(char*)a;
    char* _b=(char*)b;
    char aa[1000]={0},bb[1000]={0};
    sprintf(aa,"%s%s",_a,_b);
    sprintf(bb,"%s%s",_b,_a);
    return strcmp(bb,aa);
}
char a[50+4][1000];
int main()
{
#ifdef test
    freopen("sample.txt","r",stdin);
#endif
    int num;
    while(scanf("%d",&num)!=EOF)
    {
        if(!num)
            break;
        for(int i=0; i<num; i++)
            scanf("%s",a[i]);
        qsort(a,num,sizeof(a[0]),n_cmp);
        for(int i=0; i<num; i++)
            printf("%s",a[i]);
        puts("");
    }
    return 0;
}
方法二(效率更高一点):

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
int n_cmp(const void *a,const void *b)
{
    char* _a=(char*)a;
    char* _b=(char*)b;
    int len_a=strlen(_a),len_b=strlen(_b),flag=0,len=len_a+len_b;
    for(int i=0,j=0,k=0; i<len; i++,j++,k++)
    {
        if(_a[k]<_b[j])
        {
            flag=1;
            break;
        }
        else if(_a[k]>_b[j])
        {
            flag=-1;
            break;
        }
        if(k==len_a-1)
            k=-1;
        if(j==len_b-1)
            j=-1;
    }
    return flag;
}
char a[50+2][1000];
int main()
{
#ifdef test
    freopen("sample.txt","r",stdin);
#endif
    int num;
    while(scanf("%d",&num)!=EOF)
    {
        memset(a,0,sizeof(a));
        if(!num)
            break;
        for(int i=0; i<num; i++)
            scanf("%s",a[i]);
        qsort(a,num,sizeof(a[0]),n_cmp);
        for(int i=0; i<num; i++)
            printf("%s",a[i]);
        puts("");
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值