Codeforces837D
来源:互联网 发布:事情正在起变化 知乎 编辑:程序博客网 时间:2024/05/16 01:49
【题意】
给出n个数,让你从中选出k个数,使得它们乘积的后缀0最多,输出这个值。
【思路】
显然0是由2*5得来的,所以先算出一个数分解质因子后2和5的个数。
然后用dp[i][j]表示选择了i个数,且这i个数质因子中5的个数和为j时,质因子中2的个数和的最大值。状态转移方程为:
dp[j][l]=max(dp[j][l],dp[j-1][l-n5]+n2);
#include<bits/stdc++.h>using namespace std;#define LL long long#define N 205int n, k, dp[N][6000];int two[N], five[N];void solve(){ memset(two, 0, sizeof(two)); memset(five, 0, sizeof(five)); memset(dp, 0xbf, sizeof(dp)); int tf=0; for(int i=1; i<=n; i++) { LL x, tmp;cin>>x;tmp=x; while(x%2==0) { two[i]++; x/=2; } x=tmp; while(x%5==0) { five[i]++; x/=5; tf++; } } dp[0][0] = 0; int ans = 0; for(int i=1; i<=n; i++) for(int j = min(k, i); j >= 1; j--) for(int k = tf; k >= five[i]; k--) dp[j][k] = max(dp[j][k], dp[j-1][k-five[i]]+two[i]); for(int i = 1; i <= tf; i++) ans = max(ans, min(dp[k][i], i)); cout << ans << endl;}int main(){ while(cin>>n>>k) { solve(); } return 0;}
阅读全文
0 0
- Codeforces837D
- Codeforces837D RoundSubset
- 【DP】Codeforces837D. Round Subset
- storm安装和配置
- 关于打开页面显示popwindow报错的问题
- Alignment of Code,ACM/ICPC NEERC 2010,UVa 1593
- 三提
- java设计把两个字符串的值交换 而不使用中间变量
- Codeforces837D
- Uploading pictures from Ionic 3 to Spring Boot
- EOPLL ET 第一次写,请大神们帮忙纠错
- 织梦dedecms自定义功能函数(2):将人名币数字转换成大写输出
- 【HDU6038】Function(循环节+计数)
- 网站安全-前端XSS攻击和防御
- CodeForces
- 初学 shiro —— 登录认证与授权
- ios 整型 位数