标签: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
标签:blog os io for 代码 div amp size
原文地址:http://www.cnblogs.com/khbcsu/p/3889780.html