SPOJ 416. Divisibility by 15
来源:互联网 发布:每周日程安排软件 编辑:程序博客网 时间:2024/05/22 09:45
能被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:416 Divisibility by 15
- SPOJ 416 - Divisibility by 15(贪心)
- Divisibility by 15
- POJ 2969 Divisibility by 15
- spoj SMPDIV - Divisibility
- Divisibility by Eight
- Codeforces550C:Divisibility by Eight
- Divisibility by Eight
- C. Divisibility by Eight
- Divisibility by Eight
- Codeforces Divisibility by Eight
- CF C. Divisibility by Eight
- [CodeForces550C]Divisibility by Eight[数学]
- spoj 3196 Divisibility Relation(最大独立集输出方案)
- CODEFORCES 550 C. Divisibility by Eight
- codeforces 550C Divisibility by Eight(数学题)
- 550C Divisibility by Eight(还是枚举)
- ssh无需密码登陆配置
- 安卓页面技巧片段 - 4
- Android实现自定义锁屏控制
- linux下的GPIO驱动
- SQL EXEC用法总结
- SPOJ 416. Divisibility by 15
- Android 如何从系统图库中选择图片
- StrictMode 使用
- AdvancedDataGrid每列添加复选框和图标以及全选功能
- 如何写一个递归程序
- ORACLE Dataguard安装
- MMC 卡驱动分析
- modf 函数
- Windows下,Android模拟器调试串口的方法