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;

}


 

 

你可能感兴趣的:(visibility)