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;
}
上一篇:Map遍历四种常用方法


下一篇:map的四种遍历方式