CodeForces 214B Hometask

本题求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 }

附:(第一遍复杂代码)

  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 }
View Code
原文地址:https://www.cnblogs.com/gfc-g/p/3844825.html