Educational Codeforces Round 26 D (dp好题)

来源:互联网 发布:德州扑克 mac 编辑:程序博客网 时间:2024/05/22 06:22

D. Round Subset
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Let’s call the roundness of the number the number of zeros to which it ends.

You have an array of n numbers. You need to choose a subset of exactly k numbers so that the roundness of the product of the selected numbers will be maximum possible.

Input
The first line contains two integer numbers n and k (1 ≤ n ≤ 200, 1 ≤ k ≤ n).

The second line contains n space-separated integer numbers a1, a2, …, an (1 ≤ ai ≤ 1018).

Output
Print maximal roundness of product of the chosen subset of length k.

Examples
input
3 2
50 4 20
output
3
input
5 3
15 16 3 25 9
output
3
input
3 3
9 77 13
output
0
Note
In the first example there are 3 subsets of 2 numbers. [50, 4] has product 200 with roundness 2, [4, 20] — product 80, roundness 1, [50, 20] — product 1000, roundness 3.

In the second example subset [15, 16, 25] has product 6000, roundness 3.

In the third example all subsets has product with roundness 0.
假设dp[i][j]表示计算到第i个数时因子中总共有j个2和dp[i][j]个5
dp[i+1][j+f]=max(dp[i+1][j+f],dp[i][j]+t);
其中f代表5的个数,t代表2的个数,这里有点控制变量的思想

#include <bits/stdc++.h>#define int long longusing namespace std;int dp[500][6010];int a[234];signed main(){    for(int i=0;i<=254;i++){        for(int j=0;j<=6000;j++){            dp[i][j]=-1;        }    }    dp[0][0]=0;    int n,k;    scanf("%I64d %I64d",&n,&k);    for(int i=0;i<n;i++){        scanf("%I64d",&a[i]);    }    for(int s=0;s<n;s++){        int g=a[s];        int t=0,f=0;        while(g%2==0) g/=2,t++; g=a[s];        while(g%5==0) g/=5,f++;        for(int i=k-1;i>=0;i--){            for(int j=0;j<=6000;j++){                if(dp[i][j]!=-1) dp[i+1][j+f]=max(dp[i+1][j+f],dp[i][j]+t);            }        }    }    int Max=0;    for(int i=0;i<=6000;i++){        Max=max(Max,min(i,dp[k][i]));    }    cout<<Max<<endl;    return 0;}