SPOJ 416. Divisibility by 15
2013-08-01 08:28
113 查看
能被15整除就一定能被3和6整除,能被5整除末尾一定是0或者5,那么对于最后一位有0不选5(保证最大)。然后能被3整除,各个位上的和能被3整除,如果不满足,记和是sum.若sum%3==1,,则删一个1或者 4或者7有1不删4,有4不删7.若没有这些就删两个2,5,8的组合。当sum%3==2时,方法一样。要特别注意顺序,保证最大。
#include<cstdio> #include<cstring> #include<cstdlib> #include<set> #include<iostream> using namespace std; int num[10]; char str[1010]; int solve(int sum) { if(sum%3==1) { if(num[1]>0) { num[1]--; } else if(num[4]>0) { num[4]--; } else if(num[7]>0) { num[7]--; } else if(num[2]>=2) { num[2]-=2; } else if(num[2]>0&&num[5]>0) { num[2]--; num[5]--; } else if(num[2]>0&&num[8]>0) { num[2]--; num[8]--; } else if(num[5]>=2) { num[5]-=2; } else if(num[5]>0&&num[8]>0) { num[5]--; num[8]--; } else if(num[8]>=2) { num[8]-=2; } else return -1; } else if(sum%3==2) { if(num[2]>0) { num[2]--; } else if(num[5]>0) { num[5]--; } else if(num[8]>0) { num[8]--; } else if(num[1]>=2) { num[1]-=2; } else if(num[1]>0&&num[4]>0) { num[1]--; num[4]--; } else if(num[1]>0&&num[7]>0) { num[1]--; num[7]--; } else if(num[4]>=2) { num[4]-=2; } else if(num[4]>0&&num[7]>0) { num[4]--; num[7]--; } else if(num[7]>=2) { num[7]-=2; } else return -1; } return 0; } int main() { //freopen("in.txt","r",stdin); int cas,sum; scanf("%d",&cas); getchar(); while(cas--) { //fgets(str,1010,stdin); scanf("%s",str); memset(num,0,sizeof(num)); sum=0; for(int i=0; str[i]!='\0'; i++) { int a=str[i]-'0'; num[a]++; sum+=a; } if(num[0]==0&&num[5]==0) { cout<<"impossible\n"; continue; } if(num[0]==0&&num[5]>0) { num[5]--; if(sum%3==0) { for(int i=9; i>=0; i--) { for(int j=0; j<num[i]; j++) cout<<i; } cout<<5<<endl; } else { int a=solve(sum); if(a==-1) cout<<"impossible\n"; else { for(int i=9; i>=0; i--) { for(int j=0; j<num[i]; j++) cout<<i; } cout<<5<<endl; } } } else if((num[0]>0&&num[5]==0)||(num[0]>0&&num[5]>0)) { num[0]--; if(sum==0) { cout<<0<<endl; } else if(sum%3==0) { for(int i=9; i>=0; i--) { for(int j=0; j<num[i]; j++) cout<<i; } cout<<0<<endl; } else { int a=solve(sum); if(a==-1) cout<<"0\n"; else { int flag=0; for(int i=1; i<=9; i++) if(num[i]) flag=1; if(flag) { for(int i=9; i>=0; i--) { for(int j=0; j<num[i]; j++) cout<<i; } } cout<<0<<endl; } } } } return 0; }
相关文章推荐
- SPOJ 416 - Divisibility by 15(贪心)
- SPOJ 15. The Shortest Path 最短路径题解
- SPOJ - DIV15(数论)
- SPOJ 416 - Divisibility by 15(贪心)
- SPOJ 15. The Shortest Path 最短路径题解
- 最短路径spoj15 The Shortest Path
- SPOJ 15. The Shortest Path 堆优化Dijsktra
- SPOJ 15. The Shortest Path 堆优化Dijsktra
- spoj_15_SHPATH
- SPOJ:416 Divisibility by 15
- SPOJ 416 Divisibility by 15 细节题
- phonics-15
- spoj 1043——Can you answer these queries I
- Java Web学习(15): 客户端请求、服务器响应及其HTTP状态码
- 剑指offer-15:单链表有趣问题-有环-环长度-环入口等(续)
- Android OpenGL ES 开发教程(15):通用的矩阵变换指令
- 10-1. 在字符串中查找指定字符(15)
- 2016年团体程序设计天梯赛-决赛 L1-1. 正整数A+B(15)
- 1021. 个位数统计 (15)
- 与众不同 windows phone (15) - Media(媒体)之后台播放音频