UVA10905 思维考察

 1 /*UVA10905 思维
 2 题目大意:
 3 给定n个正整数,你的任务是把它们练成一个最大的数
 4 思考:
 5 这道题目应该是在考察归纳的思维吧
 6 我一开始的思路是将两个字符串按位比较,当位数有剩余时,再分类讨论大小。
 7 但是这样写,细节上很容易出错.
 8 但是,如果换一种方法,忽略细节,直接连成s1+s2和s2+s1,这样尾数一定相同,直接按位比较,若s1+s2<s2+s1,
 9 说明s1<s2;
10 当然,字符串首尾相连,是非常好写的。
11 */
12 #include <iostream>
13 #include <cmath>
14 #include <algorithm>
15 #include <string.h>
16 #include <stdio.h>
17 #include <set>
18 #include <stack>
19 #include <vector>
20 #define maxn 110
21 using namespace std;
22 
23 int dig(char c){
24     return c-'0';
25 }
26 struct S{
27     char s[111];
28     bool operator<(const S & X)const{
29         char s1[210],s2[210];
30         int l1=strlen(s),l2=strlen(X.s);
31         for(int i=0;i<l1;i++) s1[i]=s[i];
32         for(int i=0;i<l2;i++) s1[i+l1]=X.s[i];
33         for(int i=0;i<l2;i++) s2[i]=X.s[i];
34         for(int i=0;i<l1;i++) s2[i+l2]=s[i];
35         for(int i=0;i<l1+l2;i++){
36             if (s1[i]<s2[i]) return true;
37             if (s1[i]>s2[i]) return false;
38         }
39         return true;
40     }
41 }Ss[maxn];
42 int main(){
43     int n;
44     while(cin>>n){
45         if (n==0) break;
46         for(int i=0 ;i < n;i++){
47             scanf("%s",Ss[i].s);
48         }
49         sort(Ss,Ss+n);
50         for(int i=n-1;i>=0;i--){
51             if (i==0) printf("%s\n",Ss[i].s);
52             else printf("%s",Ss[i].s);
53         }
54     }
55     return 0;
56 }

 

posted @ 2014-04-06 13:21  little_w  阅读(510)  评论(0编辑  收藏  举报