【题意描述】
本题就是在给定的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
时间: 2024-11-10 22:01:27