给定一个只包含数字 [0..9] 的字符串,求使用字符串中的某些字符,构造一个能够被15整除的最大整数。注意,字符串中的每个字符最多只能使用一次。 输入:程序从标准输入读入数据,每行数据由一串数字组成,长度为1到1000。 输出:针对每一行输入,输出一个结果,每个结果占一行。如果无法构造出能够被15整除的整数,请输出impossible。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 |
以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[1005];
int f[10];
void xprint()
{
int tag=0;
if(f[0]==0 && f[5]>0)
{
f[5]--;
tag=1;
}
int k=0;
for(int i=9;i>=0;i--)
{
while(i && f[i]>0)
{
printf("%d",i);
f[i]--;
k=1;
}
}
if(k==0 && f[0]>0) printf("0"); //如果只有0了,只输出一个0
else while(f[0]>0) {printf("0");f[0]--;}
if(tag) printf("5");
printf("\n");
}
int main(){
while(scanf("%s",s)!=EOF)
{
memset(f,0,sizeof(f));
int l=strlen(s),sum=0,flag=1;
register int a;
for(int i=0;i<l;i++)
{
a=s[i]-'0';
sum+=a;
f[a]++; //记录每个数字出现的次数
}
if(f[0]>0 || f[5]>0)
{
if(sum%3==0) xprint();
else if(sum%3==1) //剔除最小的数使sum%3=0
{
if(f[1]>0) {f[1]--; xprint();}
else if(f[4]>0) {f[4]--; xprint();}
else if(f[7]>0) {f[7]--; xprint();}
else
{
int y=0;
while(f[2]>0 && y<2) {f[2]--;y++; };
if(f[0]==0) while(f[5]>1 && y<2) {f[5]--;y++; }
else while(f[5]>0 && y<2) {f[5]--;y++; }
while(f[8]>0 && y<2) {f[8]--;y++; }
if(y==2) xprint();
else flag=0;
}
}
else if(sum%3==2)
{
if(f[2]>0) {f[2]--; xprint();}
else if((f[5]>0 && f[0]>0) || (f[0]==0 && f[5]>1)) //只有一个5没有0,则不能删除5
{
f[5]--; xprint();
}
else if(f[8]>0) {f[8]--; xprint();}
else
{
int y=0;
while(f[1]>0 && y<2) {f[1]--;y++; }
while(f[4]>0 && y<2) {f[4]--;y++; }
while(f[7]>0 && y<2) {f[7]--;y++; }
if(y==2) xprint();
else flag=0;
}
}
}
else flag=0;
if(flag==0) printf("impossible\n");
}
return 0;
}