码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 214B

时间:2014-08-04 13:56:47      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:blog   os   io   for   代码   div   amp   size   

【题意描述】

本题就是在给定的n个整数中选出若干个数字组成一个最大数并且能被2,3,5整除。

【解题思路】

我们在求最大数是否能被2,3,5整除时,首先应该满足n个数字里面必须有0,如果没有,是不能构成最大数的。当有0以后,我们需要了解一个知识,那就是一个数字乘以10的n次方后除3的余数仍然是原来那个数字。那么我们就可以研究这n个数字与3的关系,进而研究整体。如果这n个数字加起来的整体之和除3的余数为1,那么我们需要删除一个余数为1的数(该数尽量小),或者删除两个余数为2的数字(这两个数字尽量小);当和除3的余数为2时,我们需要删除一个余数为2的数字(该数尽量小),活着的删除两个余数为1的数字(这两个数字尽量小)。

【AC代码】

#include<iostream>
#include<algorithm>
using namespace std;
#define max 100005
int num[max];
int left[max];
int vis[max];
int num_zero;
int cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int n;
    while(cin>>n)
    {
        int a,judge=0;
        memset(vis,1,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            cin>>num[i];
            if(num[i]==0) judge=1;  //记录0的个数
        }
        if(!judge) {cout<<-1<<endl;continue;}
        else 
        {
          sort(num,num+n,cmp);//排序
          int sum_total=0;
          int left_one,left_zero,left_two;
          for(int i=0;i<n;i++)
            {
                left[i]=num[i]%3;
                if(left[i]==2)
                left_two++;
                else if(left[i]==1)
                    left_one++;
                else if(left[i]==0)
                    left_zero++;
                sum_total+=left[i];
            }
            sum_left=sum_total%3;
          if(sum_left==0)//直接被整除
          {
              if(num[0]==0)  cout<<0<<endl;
              else 
                for(int i=0;i<n;i++)
                cout<<num[i];
                cout<<endl;  
          }
          else if(sum_left==1)//余数为1
          {
            if(left_one!=0)
                for(int i=n-1;i>=0;i--)
            if(left[i]==1){vis[i]=0;break;}
            else if(left_one==0&&left_two>=2)
            for(int i=n-1,count1=0;i>=0;i--)
            {
             if(left[i]==2)  {count1++;vis[i]=0;}
             if(count1==2)   break;
            }
            int count_vis=0;
            for(int i=0;i<=n-1;i++)//寻找最后剩下的数字是否有正数
                if(vis[i]&&num[i]>0) count_vis++;
            if(count_vis==0)  cout<<0<<endl;
            else 
                {for(int i=0;i<n;i++)
                  if(vis[i]) cout<<num[i];
                   cout<<endl;
                }    
          }
          else if(sum_left==2)
          {
              if(left_two!=0)
                for(int i=n-1;i>=0;i--)
              if(left[i]==2){vis[i]=0;break;}
              else if(left_two==0&&left_one>=2)
                for(int i=n-1,count2=0;i>=0;i--)
              {
                  if(left[i]==1) {count2++;vis[i]=0;}
                  if(count2==2) break;
              }
              int count_vis1=0;
              for(int i=0;i<n;i++)
                if(vis[i]&&num[i]>0) count_vis1++;
                if(count_vis1==0)  cout<<0<<endl;
                else 
                   {
                     for(int i=0;i<n;i++)
                    if(vis[i]) cout<<num[i];
                    cout<<endl;  
                   }       
          }
            
        }      
    }
    return 0;
}

  

codeforces 214B,布布扣,bubuko.com

codeforces 214B

标签:blog   os   io   for   代码   div   amp   size   

原文地址:http://www.cnblogs.com/khbcsu/p/3889780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!