codeforces 214B
2014-08-04 11:39
218 查看
【题意描述】
本题就是在给定的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代码】
代码1:优势,代码简单易读;缺点:所开数组过大,不节约空间
代码2:优点:所开空间小,技巧性强
本题就是在给定的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代码】
代码1:优势,代码简单易读;缺点:所开数组过大,不节约空间
#include<iostream> #include<algorithm> #include<string.h> using namespace std; #define max 100005 int num[max]; int l[max]; int vis[max]; int num_zero; int cmp(int a,int b) { return a>b; } int main() { int n; while(cin>>n) { int 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=0,left_zero=0,left_two=0; for(int i=0;i<n;i++) { l[i]=num[i]%3; if(l[i]==2) left_two++; else if(l[i]==1) left_one++; else if(l[i]==0) left_zero++; sum_total+=l[i]; } int 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,count1=0;i>=0;i--) { if(l[i]==2) {count1++;vis[i]=0;} if(count1==2) break; } } if(left_one!=0) { for(int i=n-1;i>=0;i--) if(l[i]==1){vis[i]=0;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(l[i]==2){vis[i]=0;break;} } if(left_two==0) { for(int i=n-1,count2=0;i>=0;i--) { if(l[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; }
代码2:优点:所开空间小,技巧性强
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int n,d[10]; while(scanf("%d",&n)!=EOF) { int i,j,sum=0,a; memset(d,0,sizeof(d)); for(i=0; i<n; i++) { scanf("%d",&a); sum+=a; d[a]++; } if(d[0]==0) printf("-1\n"); else { int flag=0; if(sum%3==1) { if(d[1]+d[4]+d[7]) { for(i=1; i<=7; i+=3) if(d[i]) {d[i]--,sum-=i;break;} } else if(d[2]+d[5]+d[8]>=2) for(j=1,i=2; i<=8; i+=3) while(d[i]&&j<=2) {d[i]--,sum-=i,j++;} } if(sum%3==2) { if(d[2]+d[5]+d[8]) { for(i=2; i<=8; i+=3) if(d[i]) {d[i]--,sum-=i;break;} } else if(d[1]+d[4]+d[7]>=2) for(j=1,i=1; i<=7; i+=3) while(d[i]&&j<=2) {d[i]--,sum-=i,j++;} } if(!flag) { if(d[1]+d[2]+d[3]+d[4]+d[5]+d[6]+d[7]+d[8]+d[9]) { for(i=9; i>=0; i--) while(d[i]--) printf("%d",i); printf("\n"); } else printf("0\n"); } } } return 0; }
相关文章推荐
- CodeForces 214B
- codeforces 214B Hometask
- codeforces 214B - Hometask
- Codeforces 214B Hometask
- CodeForces 214B Hometask
- CodeForces - 214B
- Hometask--codeForces 214B
- CodeForces 482B Interesting Array
- Codeforces 617B Chocolate (Round #340 (Div. 2) B题)
- CodeForces 448D Multiplication Table
- Codeforces 669B Little Artem and Grasshopper【思维+模拟】
- Codeforces 833B - The Bakery 【DP+线段树】
- CodeForces 396 D.On Sum of Number of Inversions in Permutations(组合数学+BIT)
- codeforces 277.5 div2 F:组合计数类dp
- Codeforces 598D Igor In the Museum (DFS)
- CodeForces 670D2 Magic Powder - 2
- codeforces 766E Mahmoud and a xor trip
- CodeForces 834C - The Meaningless Game | Codeforces Round #426 (Div. 2)
- CodeForces 452 C.Magic Trick(概率)
- CodeForces 484D Kindergarten