本题求n个数组成的大数,要求是2,3,5的倍数。
因为是2 和5 的倍数,所以个位为 0;所以若n个数中没有0,直接输出-1;
难点就是要求为3 的倍数。
因为若某个数为3的倍数,则其各位数的和必然是3的倍数。
当n个数的和为3的倍数时从大到小输出便可;
当n个数的和不为3的倍数时,若n个数中有模3余数与和模3余数相同时,去掉其中最小的,否则去掉两个模3余数不为0且与和模3余数不同的数中最小的。若没有这些数,输出-1;
注意当结果为0时,不能输出前导0;
ps:开始写了一个很复杂的代码,后来看过大牛们60ms的算法后又敲了一遍。。。结果还有92ms。给大牛跪了 orz ~~o(>_<)o ~~
附:(第二遍稍简洁代码)
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int main (){ 6 int n; 7 int sign[5]; 8 int num[20]; 9 int sum; 10 while (cin>>n){ 11 sum=0; 12 sign[0]=sign[1]=sign[2]=100; 13 memset (num,0,sizeof num); 14 for (int i=0;i<n;i++){ 15 int x; 16 cin>>x; 17 num[x]++; 18 sum+=x; 19 sign[x%3]=min (sign[x%3],x); 20 } 21 if (num[0]==0){ //n个数中没有0; 22 cout<<-1<<endl; 23 continue ; 24 } 25 if (sum%3){ 26 if (sign[sum%3]==100){ 27 int temp=2; 28 for (int i=0;i<10;i++){//cout<<i<<" "<<num[i]<<endl; 29 if (i%3!=0&&num[i]){ 30 num[i]--; 31 temp--; 32 n--; //为末尾去前导零准备; 33 } 34 if (i%3!=0&&num[i]){ 35 num[i]--; 36 temp--; 37 n--; 38 } 39 if (temp==0) 40 break ; 41 } 42 if (temp){ 43 cout<<-1<<endl; 44 continue ; 45 } 46 } 47 else num[sign[sum%3]]--,n--; 48 } 49 if (num[0]==n){ //若结果为0,不能输出前导零; 50 cout<<0<<endl; 51 continue ; 52 } 53 for (int i=9;i>=0;i--) 54 while (num[i]--) 55 cout<<i; 56 cout<<endl; 57 } 58 return 0; 59 }
附:(第一遍复杂代码)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 5 #define maxn 100000+10 6 7 using namespace std; 8 9 int sum,ans; 10 int n; 11 int sign[5]; 12 int a[maxn]; 13 14 int main (){ 15 while (cin>>n){ 16 sum=0; 17 sign[0]=sign[1]=sign[2]=100; 18 for (int i=0;i<n;i++){ 19 cin>>a[i]; 20 sum+=a[i]; 21 int temp; 22 temp=a[i]%3; 23 if (temp){ 24 sign[temp]=min (sign[temp],a[i]); 25 } 26 } 27 sort (a,a+n); 28 if (a[0]!=0){ 29 cout<<"-1"<<endl; 30 continue ; 31 } 32 if (sum%3==0){ 33 int flag=0; 34 for (int i=n-1;i>=0;i--){ 35 if (flag==0&&a[i]==0) 36 break ; 37 cout<<a[i]; 38 flag=1; 39 } 40 if (flag==0) 41 cout<<"0"; 42 cout<<endl; 43 continue ; 44 } 45 else if (sum%3==1){ 46 if (sign[1]==100){ 47 int temp=2; 48 for (int i=0;i<n;i++){ 49 if (a[i]%3==2){ 50 a[i]=100; 51 temp--; 52 } 53 if (temp==0) 54 break ; 55 } 56 if (temp){ 57 cout<<"-1"<<endl; 58 continue ; 59 } 60 int flag=0; 61 for (int i=n-1;i>=0;i--){ 62 if (a[i]==100) 63 continue ; 64 if (flag==0&&a[i]==0) 65 break ; 66 cout<<a[i]; 67 flag=1; 68 } 69 if (flag==0) 70 cout<<"0"; 71 cout<<endl; 72 } 73 else { 74 int temp=1; 75 int flag=0; 76 for (int i=n-1;i>=0;i--){ 77 if (a[i]==sign[1]&&temp){ 78 temp=0; 79 continue ; 80 } 81 if (flag==0&&a[i]==0) 82 break ; 83 cout<<a[i]; 84 flag=1; 85 } 86 if (flag==0) 87 cout<<"0"; 88 cout<<endl; 89 } 90 } 91 else if (sum%3==2){ 92 if (sign[2]==100){ 93 int temp=2; 94 for (int i=0;i<n;i++){ 95 if (a[i]%3==1){ 96 a[i]=100; 97 temp--; 98 } 99 if (temp==0) 100 break ; 101 } 102 if (temp){ 103 cout<<"-1"<<endl; 104 continue ; 105 } 106 int flag=0; 107 for (int i=n-1;i>=0;i--){ 108 if (a[i]==100) 109 continue ; 110 if (flag==0&&a[i]==0) 111 break ; 112 cout<<a[i]; 113 flag=1; 114 } 115 if (flag==0) 116 cout<<"0"; 117 cout<<endl; 118 } 119 else { 120 int temp=1; 121 int flag=0; 122 for (int i=n-1;i>=0;i--){ 123 if (a[i]==sign[2]&&temp){ 124 temp=0; 125 continue ; 126 } 127 if (flag==0&&a[i]==0) 128 break ; 129 flag=1; 130 cout<<a[i]; 131 } 132 if (flag==0) 133 cout<<"0"; 134 cout<<endl; 135 } 136 } 137 } 138 return 0; 139 }