• SPOJ 416


    糟烂的代码啊...  这个题目思路很简单——末位只可能为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
    ");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
    ");
                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
    ");
                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("
    ");
        }
        else
        {
            num[5]--;
            for(int i=9; i>=0; i--)
            {
                for(int j=0; j<num[i]; j++)
                    printf("%d",i);
            }
            printf("5
    ");
        }
    }
    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
    ");
            }
            else
            {
                solve(sum);
            }
        }
        return 0;
    }


  • 相关阅读:
    上周热点回顾(12.1212.18)
    上周热点回顾(11.2111.27)
    上周热点回顾(11.1411.20)
    博客园电子期刊2011年11月刊发布啦
    “CDN加速”测试
    上周热点回顾(11.2812.4)
    上周热点回顾(12.1912.25)
    上周热点回顾(12.512.11)
    提醒:安装MS11100 .NET Framework高危漏洞补丁一定要所有服务器一起安装
    郑州公积金
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3223557.html
Copyright © 2020-2023  润新知