1860 最大数
题目描述 Description
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
输入描述 Input Description
第一行一个正整数n。
第二行n个正整数,空格隔开。
输出描述 Output Description
连接成的多位数。
样例输入 Sample Input
Sample 1:
3
13 312 343
Sample 2:
4
7 13 4 246
样例输出 Sample Output
Sample 1:
34331213
Sample 2:
7424613
数据范围及提示 Data Size & Hint
n≤20
题意:第一行输入N,然后输入N个数。让你组合这些数字,输出最大值;
主要还是在于判断,比较a,b的位置,判断方法为a+b的组合数>b+a的组合数:
采用了优先队列+贪心:


1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <queue> 5 #include <stdio.h> 6 #include <string.h> 7 #include <stdlib.h> 8 using namespace std; 9 struct node 10 { 11 int Len; 12 int n; 13 friend bool operator <(node a,node b) 14 { 15 int Len1,Len2,j,i; 16 for(i=0,Len1=1;i<a.Len;i++)Len1*=10; 17 for(i=0,Len2=1;i<b.Len;i++)Len2*=10; 18 return a.n*Len2+b.n<b.n*Len1+a.n; 19 } 20 }; 21 int main() 22 { 23 int N,i; 24 int Num[10086]; 25 while(scanf("%d",&N)!=EOF) 26 { 27 priority_queue<node>ID; 28 node num; 29 int sign,j; 30 for(i=0;i<N;i++) 31 { 32 scanf("%d",&num.n); 33 j=num.n;sign=0; 34 while(j) 35 { 36 sign++; 37 j/=10; 38 } 39 num.Len=sign; 40 ID.push(num); 41 } 42 for(i=0;i<N;i++) 43 { 44 printf("%d",ID.top().n); 45 ID.pop(); 46 }putchar(10); 47 } 48 return 0; 49 }