codeforces 0 和5
阿新 • • 發佈:2019-01-22
小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; }