D - Round Subset codeforces837d

D - Round Subset

思路:背包;

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
ll n,m,dp[250][10050],tmp,p2,p5,pos,sum,ans;
int main()
{
    //freopen("data.txt","r",stdin);
    scanf("%lld%lld",&n,&m);
    memset(dp,-0x7f,sizeof(dp)),dp[0][0]=0;;
    for(ll i=1;i<=n;i++)
    {
        cin>>tmp,pos=tmp,p5=0,p2=0;
        while(pos%5==0) pos/=5,p2++;
        while(tmp%2==0) tmp/=2,p5++;
        sum+=p5;
        for(ll v=min(i,m);v>=1;v--)
            for(ll e=sum;e>=p5;e--) dp[v][e]=max(dp[v][e],dp[v-1][e-p5]+p2);
    }
    for(ll i=1;i<=sum;i++) ans=max(ans,min(i,dp[m][i]));
    cout<<ans;
    return 0;
}
时间: 2024-10-09 23:11:09

D - Round Subset codeforces837d的相关文章

Codeforces 837D Round Subset(背包)

题目链接  Round Subset 题意  在n个数中选择k个数,求这k个数乘积末尾0个数的最大值. 首先我们预处理出每个数5的因子个数c[i]和2的因子个数d[i] 然后就可以背包了. 设f[i][j]为选i个数,5的因子总和为j时,2的因子总和的最大值. 则状态转移方程为 $f[i][j] = max(f[i - 1][j - c[k]] + d[k])$ 注意边界条件 时间复杂度$O(5200nk)$ #include <bits/stdc++.h> using namespace s

Educational Codeforces Round 26 D. Round Subset(dp)

题目链接:Educational Codeforces Round 26 D. Round Subset 题意: 给你n个数,让你选其中的k个数,使得这k个数的乘积的末尾的0的个数最大. 题解: 显然,末尾乘积0的个数和因子2和因子5的个数有关. 然后考虑dp[i][j]表示选i个数,当前因子5的个数为j时,能得到因子2最多的为多少. 那么对于每个数,记录一下因子2和5的个数,做一些01背包就行了. 1 #include<bits/stdc++.h> 2 #define mst(a,b) me

Educational Codeforces Round 26 D. Round Subset 动态规划

D. Round Subset 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

【动态规划】Round Subset

CF837D. Round Subset 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 ma

Codeforces 837D Round Subset - 动态规划 - 数论

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

[CF837D] Round Subset(滚动数组,01背包)

题目链接:http://codeforces.com/contest/837/problem/D 题意:n个数里选k个数,使得它们的乘积末尾0个数最多. 只需要统计每个数的2和5的数量,一个作为容量,一个作为价值.f(i,k,j)表示前i个数选k个,一共有j个2的时候,5最多有几个. 外层枚举前i个数,内层做01背包就可以.但是会MLE,所以滚动数组. 特别注意的是,滚动数组在滚动的时候要拷贝整层,原因是我在更新01背包的时候没有及时复制... 还有f要注意当前层一定要从之前存在的状态更新过来,

【动态规划】【滚动数组】Educational Codeforces Round 26 D. Round Subset

给你n个数,让你任选K个,使得它们乘起来以后结尾的0最多. 将每个数的因子2和因子5的数量求出来,记作a[i]和b[i]. 答案就是max{ min{Σa[i],Σb[i]} }(a[i],b[i]是选择的那些数). 暴力dp是f(i,j,k)表示前i个数,选j个,其中包含k个5的情况下,最多能包含多少个2. 转移是f(i,j,k)=max{ {f(t,j-1,k-b[i]}+a[i]}(1<=i<t) , f(i-1,j,k) },时间是O(18 * n^3),但空间存不下. 注意第二维为j

Educational Codeforces Round 26-D. Round Subset

题目大意:给你n个数字(小于1e18),从n个数中取k个数字相乘,使其后缀0最多,问你后缀0最多是多少. 知道得用三维的dp[ i ] [ j ] [ k ]  第一维表示用到第 i 个数为止,j 表示从中选 j 个数,想了好久也不知道 第三维是什么,我想不到怎么总结当前状况相乘之后 0 的个数QAQ. 思路:其实后面0的个数就是相乘之后有多少个10,10可以分解成 2 * 5,这样我们只要统计每个数字中 有多少个2的因子和5的因子就好了.dp [ i ][ j ][ k ]表示,在(1 - i

Codeforces 837D - Round Subset DP

先算出每个数的pop1(twonum),pop(fivenum)然后DP ans[i][j]表示选i个数有j个2时最多有多少个5 转移方程是 for(int j=k;j>=1;j--) { for(int w=pop1;w<5000;w++) { ans[j][w]=max(ans[j][w],ans[j-1][w-pop1]+pop); } } AC程序: #include <bits/stdc++.h> #include <cstring> #include <