[Offer收割]编程练习赛50
2024-08-26 20:50:51
题目3 : 末尾有最多0的乘积
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定N个正整数A1, A2, ... AN。
小Hi希望你能从中选出M个整数,使得它们的乘积末尾有最多的0。
输入
第一行包含两个个整数N和M。
第二行包含N个整数A1, A2, ... AN。
对于30%的数据,1 ≤ M ≤ N ≤ 12
对于100%的数据,1 ≤ M ≤ N ≤ 100 1 ≤ Ai ≤ 1000000000
输出
末尾最多的0的个数
- 样例输入
-
4 2
8 25 30 40 - 样例输出
-
3
这个组成0就是2 5的个数,找到5的最大值,去枚举2,或者找5去枚举2都可以的吧
dp[i][j][k]表示第i个数选j个数选k个5的个数的0的个数
#include<bits/stdc++.h>
using namespace std;
int dp[][][];
int la(int x,int p)
{
int t=;
while(x%p==) x/=p,t++;
return t;
}
int main()
{
int n,k;
cin>>n>>k;
memset(dp,-,sizeof(dp));
dp[][][]=;
int cur=,sum=,ans=;
for(int i=,x; i<=n; ++i)
{
cin>>x;
int five=la(x,),two=la(x,);
sum+=five,cur^=;
for(int j=; j<=i&&j<=k; ++j)
{
for(int k=; k<=sum; ++k)
{
dp[cur][j][k]=max(dp[cur][j][k],dp[cur^][j][k]);
if(j>=&&k-five>=&&dp[cur^][j-][k-five]>=)
dp[cur][j][k]=max(dp[cur][j][k],dp[cur^][j-][k-five]+two);
}
}
}
for(int i=; i<=sum; i++)
ans=max(ans,min(i,dp[cur][k][i]));
cout<<ans;
return ;
}
最新文章
- OpenCASCADE DataExchange DWG
- Activity数据传递
- UIButton添加倒计时
- 重新想象 Windows 8 Store Apps (39) - 契约: Share Contract
- maven学习手记 - 2
- css3隐藏导航栏总结
- Day-12: 进程和线程
- [bzoj4755][Jsoi2016]扭动的回文串
- combobox数据绑定
- 1.6W star 的 JCSprout 阅读体验大提升
- 小程序-canvas在IOS手机层级最高无法展示问题
- vue 快速入门、常用指令(1)
- 3D 数据
- scss切页面
- [AWS vs Azure] 云计算里AWS和Azure的探究(2)
- 批处理设置IP地址 - imsoft.cnblogs
- STM8S——Analog/digital converter (ADC)
- Informatica 常用组件Lookup之三 关系和平面文件查找
- .netMVC Vue axios 获取数据
- 第9章 初识STM32固件库—零死角玩转STM32-F429系列
热门文章
- COGS 1715. [CQOI2011]动态逆序对
- python基础教程总结15——4 新闻聚合
- UVA11090 Going in Cycle (二分+判负环)
- [uva816]AbbottsRevenge Abbott的复仇(经典迷宫BFS)
- 2407: C语言习题 整数转换成字符串
- js中异步方案比较完整版(callback,promise,generator,async)
- 使用jsp读取某个目录下的所有文件名,并保存在json文件中
- Sum All Numbers in a Range-freecodecamp算法题目
- Ping 命令的执行过程和应用协议
- C#基础-循环语句