SPOJ 416 - Divisibility by 15(贪心)
糟烂的代码啊... 这个题目思路很简单——末位只可能为0和5,所有数字的和肯定被3整除
没有0和5的肯定不行
否则,把所有数字求和
如果被3整除,则从大到小输出
如果除3余1,则按以下顺序——删1;删4;删7;删2、5、8中的2个(特别注意如果没有0要保留一个5)
如果除3余2,则按以下顺序——删2;删5(特别注意如果没有0要保留);删8;删1、4、7中的2个
下面是糟烂的代码——
//糟烂代码总结 —— 没有章法,思路不清,逻辑性太高,导致找不出错 //以后写代码引以为戒 #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; char s[1010]; int num[12]; int check(int sum) { if(!num[0]&&!num[5])return 0; if(sum==0)return 1; if(num[0])return 1; if(sum%3==1) { if(num[1]==0&&num[4]==0&&num[7]==0&&(num[2]+num[5]+num[8]<2)) { return 0; } } else if(sum%3==2) { if(num[5]) { if(num[2]==0&&num[5]<=1&&num[8]==0&&(num[1]+num[4]+num[7]<2)) { return 0; } } else { if(num[2]==0&&num[5]==0&&num[8]==0&&(num[1]+num[4]+num[7]<2)) { return 0; } } } return 1; } int solve(int sum) { int ct=0; if(sum==0) { printf("0\n");return 0; } if(sum%3==1) { ct=1; if(num[1]){num[1]--;sum-=1;ct--;} else if(num[4]){num[4]--;sum-=4;ct--;} else if(num[7]){num[7]--;sum-=7;ct--;} else { ct=2; if(num[0]==0) { for(int i=2; i<=8; i+=3) { if(ct==0)break; if(i==5&&num[i]==1)continue;//此处写错导致错误(原来是写的num[5]==1,影响到了8) while(num[i]>0) { num[i]--; ct--; sum-=i; if(ct==0)break; if(i==5&&num[i]==1)break; } } } else { for(int i=2; i<=8; i+=3) { if(ct==0)break; while(num[i]>0) { num[i]--; ct--; sum-=i; if(ct==0)break; } } } } if(ct>0) { printf("impossible\n"); return 0; } } else if(sum%3==2) { ct=1; if(num[2]){num[2]--;sum-=2;ct--;} else if(num[5]==1&&num[0]>0){num[5]--;sum-=5;ct--;} else if(num[5]>1){num[5]--;sum-=5;ct--;} else if(num[8]){num[8]--;sum-=8;ct--;} else { ct=2; for(int i=1; i<=7; i+=3) { if(ct==0)break; while(num[i]>0) { num[i]--; ct--; sum-=i; if(ct==0)break; } } } if(ct>0) { printf("impossible\n"); return 0; } } if(num[0]) { if(sum==0)printf("0"); else for(int i=9; i>=0; i--) { for(int j=0; j<num[i]; j++) printf("%d",i); } printf("\n"); } else { num[5]--; for(int i=9; i>=0; i--) { for(int j=0; j<num[i]; j++) printf("%d",i); } printf("5\n"); } } int main() { int T; //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&T); while(T--) { scanf("%s",s); int l=strlen(s); memset(num,0,sizeof(num)); int sum=0; for(int i=0; i<l; i++) { num[s[i]-'0']++; sum+=s[i]-'0'; } if(!check(sum)) { printf("impossible\n"); } else { solve(sum); } } return 0; }