原题链接:http://codeforces.com/contest/837/problem/D

题意:在n个数字中,取k个数,使这些数的乘积后缀“0”的个数最大,输出后缀0的最大数量。

思路:显然只有含有因子2和5的数相乘才能得到10的倍数,所以对每个数求因子2和5的个数。

这里运用背包的思想,对于 i 个数,假设总共有 j 个2因子数目,能够得到的5的因子数目最大为dp[i][[j],状态转移方程为:

dp[i][j]=max(dp[i][j], dp[i-1][dp[j-num_two]+num_five])

其中num_two和num_five是枚举到的某个数所含2和5的因子数。

最后求出min(i, dp[i][j])的最大值即可。

AC代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int MAXN=;
const int INF=;
int dp[MAXN][MAXN*];
int main()
{
int n,k;
long long a;
scanf("%d %d", &n, &k);
int sum2=;
for(int i=;i<MAXN;i++){
for(int j=;j<MAXN*;j++)
dp[i][j]=-INF;
}
dp[][]=;
for(int s=;s<=n;s++){
scanf("%I64d", &a);
int x=,y=;
while(a%==){
a/=;
x++;
}
while(a%==){
a/=;
y++;
}
sum2+=x;
for(int i=min(s, k);i>=;i--){//避免重复计算导致答案错误,从大到小
for(int j=x;j<=sum2;j++){
dp[i][j]=max(dp[i-][j-x]+y, dp[i][j]);
}
}
}
int res=,tmp;
for(int j=;j<=sum2;j++){
tmp=min(j, dp[k][j]);
res=max(tmp, res);
}
printf("%d\n", res);
return ;
}

Codeforces 837D--Round Subset (DP)的更多相关文章

  1. Codeforces 837D - Round Subset(dp)

    837D - Round Subset 思路:dp.0是由2*5产生的. ①dp[i][j]表示选i个数,因子2的个数为j时因子5的个数. 状态转移方程:dp[i][j]=max(dp[i][j],d ...

  2. Codeforces 837D Round Subset(背包)

    题目链接  Round Subset 题意  在n个数中选择k个数,求这k个数乘积末尾0个数的最大值. 首先我们预处理出每个数5的因子个数c[i]和2的因子个数d[i] 然后就可以背包了. 设f[i] ...

  3. CodeForces 837D - Round Subset | Educational Codeforces Round 26

    /* CodeForces 837D - Round Subset [ DP ] | Educational Codeforces Round 26 题意: 选k个数相乘让末尾0最多 分析: 第i个数 ...

  4. Codeforces Gym101341K:Competitions(DP)

    http://codeforces.com/gym/101341/problem/K 题意:给出n个区间,每个区间有一个l, r, w,代表区间左端点右端点和区间的权值,现在可以选取一些区间,要求选择 ...

  5. codeforces Educational Codeforces Round 16-E(DP)

    题目链接:http://codeforces.com/contest/710/problem/E 题意:开始文本为空,可以选择话费时间x输入或删除一个字符,也可以选择复制并粘贴一串字符(即长度变为两倍 ...

  6. Codeforces Global Round 1D(DP,思维)

    #include<bits/stdc++.h>using namespace std;int dp[1000007][7][7];int cnt[1000007];int main(){  ...

  7. CodeForces B. The least round way(dp)

    题目链接:http://codeforces.com/problemset/problem/2/B B. The least round way time limit per test 5 secon ...

  8. 【Codeforces】CF 2 B The least round way(dp)

    题目 传送门:QWQ 分析 求结尾0的数量QwQ. 10只能是$ 2 \times 5 $,我们预处理出每个数因子中2和5的数量. 我们接着dp出从左上到右下的经过的最少的2的数量和最少的5的数量.两 ...

  9. Codeforces 837D - Round Subset DP

    先算出每个数的pop1(twonum),pop(fivenum)然后DP ans[i][j]表示选i个数有j个2时最多有多少个5 转移方程是 ;j--) { ;w++) { ans[j][w]=max ...

随机推荐

  1. C#-概念-类:类

    ylbtech-C#-概念-类:类 类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础.类是一种用户定义类型,也称类类型.每个类包含 ...

  2. 测开之路七十七:性能测试蓝图之js

    //定义全局的editor = nullvar editor = null; //ace_editor的初始化函数function ace_editor() { var editor = ace.ed ...

  3. 2019/12/22 TZOJ

    4986 Team Formation http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=498 ...

  4. Spring学习(三)--高级装配

    一.Spring profile 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁 移到另外一个环境.开发阶段中,某些环境相关做法可能并不适合迁 移到生产环境中,甚至即便迁移过去也无法正常 ...

  5. Java并发编程:Concurrent锁机制解析

    Java并发编程:Concurrent锁机制解析 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: # ...

  6. Day5---Python的random库

    random库 1.random库是随机数的Python标准库   2.原理 : random生成的伪随机数,而采用梅森旋转算法生成的(伪)随机序列中的元素叫做伪随机数 https://liam.pa ...

  7. ArrayList与List<T>的区别

    ArrayList alist = new ArrayList(); //ArrayList(object value),所以ArrayList可以存储任何类型,如果存储值类型的话会进行装箱操作,在操 ...

  8. C# PDF文件转图片

    参考:https://blog.csdn.net/lai124793549/article/details/53392281 https://www.cnblogs.com/xiewei123/p/1 ...

  9. git 命令图解

    git 命令图解   初始化版本库 git config user.name "lsgx" git config user.email "lsgxthink@163.co ...

  10. vue.js(09)--v-for中的key

    v-for中key的使用注意事项 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...