CF837D求助
  • 板块题目总版
  • 楼主NEO_bone
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/8/26 15:04
  • 上次更新2023/10/27 13:35:55
查看原帖
CF837D求助
464094
NEO_bone楼主2022/8/26 15:04
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define ll long long

ll n,k,ans;
ll sum5,sum2;
struct one{
	ll n,s5,s2; 
}a[205];
ll f[205][205];
//f[i][j]代表在前i个数中选j个的最大值 

void ycl(ll z)
{
	while(a[z].n!=0&&a[z].n%2==0)
	{
		a[z].s2++;
		a[z].n/=2;
	}
	while(a[z].n!=0&&a[z].n%5==0)
	{
		a[z].s5++;
		a[z].n/=5;
	}
	return ;
}

int main()
{
//	freopen("A.in","r",stdin);
//	freopen("A.out","w",stdout);
	
	cin>>n>>k;
	for(ll i=1;i<=n;i++)
	cin>>a[i].n,ycl(i);//,cout<<a[i].s2<<' '<<a[i].s5<<endl;
	for(ll i=1;i<=n;i++)
	for(ll l=k;l>=1;l--){
		sum5+=a[i].s5;
		sum2+=a[i].s2;
		f[i][l]=max(f[i-1][l],f[i-1][l-1]+min(sum2,sum5));
		int pos=min(sum2,sum5);
		sum2-=pos,sum5-=pos;
	}
	
	cout<<f[n][k]<<endl;
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
2022/8/26 15:04
加载中...