1. 程式人生 > >codeforces 0 和5

codeforces 0 和5

小K手中有n張牌,每張牌上有一個一位數的數,這個字數不是0就是5。小K從這些牌在抽出任意張(不能抽0張),排成一行這樣就組成了一個數。使得這個數儘可能大,而且可以被90整除。

注意:

1.這個數沒有前導0,

2.小K不需要使用所有的牌。

每個測試資料輸入共2行。
第一行給出一個n,表示n張牌。(1<=n<=1000)
第二行給出n個整數a[0],a[1],a[2],…,a[n-1] (a[i]是0或5 ) 表示牌上的數字。
Output
共一行,表示由所給牌組成的可以被90整除的最大的數,如果沒有答案則輸出”-1
輸入
4
5 0 5 0
輸出
0
解析:
搜尋絕對超時,能被9整除的數的各個位數加起來一定能被9整除
所以我們可以列舉每位數的使用情況,選擇位數最多的情況,篩選出來,最大的放前面,進行輸出
程式碼如下
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int num[100010];
int dp[6];long long maxx;
int main()
{
    int n;
    bool flag=false;
    int no;
    cin>>n;
    int i,j,k,l,o;
    int wu,si,san,er,yi;
    int sum=0;
    wu=si=san=er=yi=0;
    memset(dp,0,sizeof(dp));
    for(i=0;i<n;i++)
    {
        cin>>no;
        dp[no]+=1;
        if(no==0)
        {
            flag=true;
        }
    }
    if(!flag)
    {
        printf("-1\n");
        return 0;
    }
    else
    {
        for(i=0;i<=dp[5];i++)
        {
            for(j=0;j<=dp[4];j++)
            {
                for(k=0;k<=dp[3];k++)
                {
                    for(l=0;l<=dp[2];l++)
                    {
                       for(o=0;o<=dp[1];o++)
                       {
                           if((i*5+j*4+k*3+l*2+o*1)%9!=0)
                           continue;
                           if(i+j+k+l+o>sum)
                           {
                               sum=i+j+k+l+o;
                               wu=i;si=j;san=k;er=l;yi=o;
                           }
                       }

                    }

                }
            }
        }
        for(i=1;i<=wu;i++)printf("5");
        for(i=1;i<=si;i++)printf("4");
        for(i=1;i<=san;i++)printf("3");
        for(i=1;i<=er;i++)printf("2");
        for(i=1;i<=yi;i++)printf("1");
        if(wu==0&&si==0&&san==0&&er==0&&yi==0)
        printf("0");
        else
        for(i=1;i<=dp[0];i++)printf("0");
        printf("\n");
    }
    return 0;
}