SPOJ 416. Divisibility by 15

来源:互联网 发布:每周日程安排软件 编辑:程序博客网 时间:2024/05/22 09:45

         能被15整除就一定能被3和6整除,能被5整除末尾一定是0或者5,那么对于最后一位有0不选5(保证最大)。然后能被3整除,各个位上的和能被3整除,如果不满足,记和是sum.若sum%3==1,,则删一个1或者 4或者7有1不删4,有4不删7.若没有这些就删两个2,5,8的组合。当sum%3==2时,方法一样。要特别注意顺序,保证最大。


#include<cstdio>#include<cstring>#include<cstdlib>#include<set>#include<iostream>using namespace std;int num[10];char str[1010];int solve(int sum){    if(sum%3==1)    {        if(num[1]>0)        {                       num[1]--;        }        else if(num[4]>0)        {            num[4]--;                   }        else if(num[7]>0)        {            num[7]--;                   }        else  if(num[2]>=2)        {            num[2]-=2;                   }        else if(num[2]>0&&num[5]>0)        {            num[2]--;            num[5]--;                   }        else if(num[2]>0&&num[8]>0)        {            num[2]--;            num[8]--;                    }        else if(num[5]>=2)        {            num[5]-=2;                   }        else if(num[5]>0&&num[8]>0)        {            num[5]--;            num[8]--;                   }        else if(num[8]>=2)        {            num[8]-=2;                   }        else  return -1;    }    else if(sum%3==2)    {        if(num[2]>0)        {            num[2]--;                    }        else if(num[5]>0)        {            num[5]--;                   }        else if(num[8]>0)        {            num[8]--;                    }        else  if(num[1]>=2)        {            num[1]-=2;                    }        else if(num[1]>0&&num[4]>0)        {            num[1]--;            num[4]--;                   }        else if(num[1]>0&&num[7]>0)        {            num[1]--;            num[7]--;                   }        else if(num[4]>=2)        {            num[4]-=2;                    }        else if(num[4]>0&&num[7]>0)        {            num[4]--;            num[7]--;                    }        else if(num[7]>=2)        {            num[7]-=2;                   }        else  return -1;    }    return 0;}int main(){    //freopen("in.txt","r",stdin);    int cas,sum;    scanf("%d",&cas);    getchar();    while(cas--)    {        //fgets(str,1010,stdin);        scanf("%s",str);        memset(num,0,sizeof(num));        sum=0;        for(int i=0; str[i]!='\0'; i++)        {            int a=str[i]-'0';            num[a]++;            sum+=a;        }        if(num[0]==0&&num[5]==0)        {            cout<<"impossible\n";            continue;        }        if(num[0]==0&&num[5]>0)        {            num[5]--;            if(sum%3==0)            {                for(int i=9; i>=0; i--)                {                    for(int j=0; j<num[i]; j++)                        cout<<i;                }                cout<<5<<endl;            }            else            {                int a=solve(sum);                if(a==-1)                    cout<<"impossible\n";                else                {                    for(int i=9; i>=0; i--)                    {                        for(int j=0; j<num[i]; j++)                            cout<<i;                    }                    cout<<5<<endl;                }            }        }        else if((num[0]>0&&num[5]==0)||(num[0]>0&&num[5]>0))        {            num[0]--;            if(sum==0)            {                cout<<0<<endl;            }            else if(sum%3==0)            {                for(int i=9; i>=0; i--)                {                    for(int j=0; j<num[i]; j++)                        cout<<i;                }                cout<<0<<endl;            }            else            {                int a=solve(sum);                if(a==-1)                    cout<<"0\n";                else                {                    int flag=0;                    for(int i=1; i<=9; i++)                        if(num[i])  flag=1;                    if(flag)                    {                        for(int i=9; i>=0; i--)                        {                            for(int j=0; j<num[i]; j++)                                cout<<i;                        }                    }                    cout<<0<<endl;                }            }        }    }    return 0;}