博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 26 D dp,思维
阅读量:5295 次
发布时间:2019-06-14

本文共 1203 字,大约阅读时间需要 4 分钟。

D. Round Subset

题意:有 n 个数,从中选出 k 个数,要使这 k 个数的乘积末尾的 0 的数量最多。

tags:dp好题

dp[i][j][l] 表示前 i 个数,选取了其中 j 个数,分解因子后有 l 个 5时,最多有多少个 2 。i 这一维明显可以省略。

这题一开始有个地方写挫了。。选取 j 个数时,应该反着来,即 for( j, k, 1) ,不是 for( j, 1, k) ,不然会多算。

#include
using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define rep(i,a,b) for (int i=a; i<=b; ++i)#define per(i,b,a) for (int i=b; i>=a; --i)#define mes(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define MP make_pair#define PB push_back#define fi first#define se secondtypedef long long ll;const int N = 200005;int dp[210][6100], n, k;int main(){ scanf("%d%d", &n, &k); ll ai, a2, ans=0; int t2, t5; rep(j,0,200) rep(l,0,6000) dp[j][l] = -INF; dp[0][0] = 0; rep(i,1,n) { scanf("%lld", &ai); t2 = t5 = 0; for(a2=ai; a2%2==0; a2/=2, ++t2) ; for(a2=ai; a2%5==0; a2/=5, ++t5) ; per(j,k,1) //???? { rep(l,t5,6000) { dp[j][l] = max(dp[j][l], dp[j-1][l-t5]+t2); if(j==k) ans = max(ans, 1LL*min(l, dp[j][l])); } } } printf("%lld\n", ans); return 0;}

 

转载于:https://www.cnblogs.com/sbfhy/p/7296433.html

你可能感兴趣的文章
fckeditor 添加上传附件功能
查看>>
实现用struts2流信息获得图片
查看>>
linux低权限执行高权限
查看>>
unsigned和signed
查看>>
filter的执行顺序
查看>>
webpack 打包出多个HTML文件,多个js文件,图片文件放置到指定文件夹中
查看>>
linux rc.sysinit文件详解
查看>>
BLSTM的训练算法、解码算法以及模型的改进
查看>>
深入理解Aho-Corasick自动机算法
查看>>
NBUT 1118 Marisa's Affair (排序统计,水)
查看>>
c++的bind1st()与bind2nd() 二元算子转一元算子
查看>>
使左右两个DIV高度相等的方法
查看>>
用valgrind检测php扩展内存泄露
查看>>
django 模型中 class Meta 内 各种属性的用法
查看>>
ASP.NET 4.0配置文件中的ClientIDMode属性
查看>>
常对象与this指针
查看>>
PHP中调用move_uploaded_file函数提示failed to open stream和 Unable to move
查看>>
转:织梦CMS系统中power by dedecms怎么去掉,power by dedecms什么
查看>>
Maven实战三
查看>>
Ubuntu下软件的搜索与安装
查看>>