• 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
  • 相关阅读:
    Tomcat性能调优
    spring 提供的可扩展的接口和类
    Spring boot 定义exit codes 让你定位问题更加简单
    spring中@Async注解的原理和使用
    SpringCache源码深度解析
    ApplicationContextAware和BeanFactoryAware使用理解
    spring aop中引介拦截器的用法
    提高安全性而在HTTP响应头中可以使用的各种响应头字段
    spring aop中targetSource的理解
    PowerMockito使用PowerMockIgnore注解消除类加载器引入的ClassCastException
  • 原文地址:https://www.cnblogs.com/gfc-g/p/3844825.html
Copyright © 2020-2023  润新知