题意:
给你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;
}