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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章