UVA 10905 Children's Game

题意:

给你n个正整数,把它们连接成一个最大的整数,如:123,124,56,90有24种连接方法,最大结果为:9056124123。

分析:

贪心方法,排序处理,排序时要注意长度不同的数,短的那个与长的前几位全相等,例如:734,7346

方法一:

共两种情况:1是 7347346;2是 7346734,只需比较它们两个的大小即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
char ch[55][1000];         //开大点,不然 WA 或 RE

int cmp(const void* a, const void* b)
{
    char* ch1 = (char*) a;
    char* ch2 = (char*) b;
    char ach[1000] = {0}, bch[1000] = {0};
    sprintf(ach, "%s%s", ch1,ch2);         //ch1在前
    sprintf(bch, "%s%s", ch2,ch1);
    return strcmp(bch, ach);
}
int main()
{
    int n;
    while(~scanf("%d", &n) && n){
        for(int i = 0; i < n; i++) scanf("%s", ch[i]);
        qsort(ch, n, sizeof(ch[0]), cmp);
        for(int i = 0; i < n; i++) printf("%s", ch[i]);
        cout <<endl;
    }
    return 0;
}

方法二:

当比较到第一个数最后一位,即 4 时再让第一个数的第一位与第二个数的下一位开始比较,与方法一思想类似,优化一下

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
char ch[55][2000];

int cmp(const void* a, const void* b)
{
    char* ch1 = (char*) a;
    char* ch2 = (char*) b;
    int len1 = strlen(ch1), len2 = strlen(ch2), len = len1 + len2;
    int i, j, k;
    for(i = 0, j = 0, k = 0; i < len; i++, j++, k++){
        if(ch1[j] < ch2[k]) return 1;
        else if(ch1[j] > ch2[k]) return -1;
        if(j == len1 - 1) j = -1;
        if(k == len2 - 1) k = -1;
    }
    return 0;
}
int main()
{
    int n;
    while(~scanf("%d", &n) && n){
        for(int i = 0; i < n; i++) scanf("%s", ch[i]);

        qsort(ch, n, sizeof(ch[0]), cmp);
        for(int i = 0; i < n; i++) printf("%s", ch[i]);
        cout <<endl;
    }
    return 0;
}


你可能感兴趣的:(UVA 10905 Children's Game)