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