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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)