NOWCODER 虚无的后缀(贪心)

链接:https://ac.nowcoder.com/acm/problem/26157
来源:牛客网

思路:

要使后缀零的个数最多,只需要考虑他的质因子2和5的个数就行了,因为其他因子对10没有贡献。
如输入:
3 2
30 20 2
因为:
20=2x2x5
2=2
30=2x5x3
要使其中两个数的乘积后缀零最多,就要使结果的因子中2x5最多,这里应该选择20和30,他们的乘积有两个2x5因子,及最长的后缀零为2

AC代码:

#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = 2e2+10;
ll n, k, x, cnt5[maxn], cnt2[maxn], vis[maxn], sum_2, sum_5;
int main() {
	cin>>n>>k;
	for (int i = 0; i < n; i++) {
		cin>>x;
		while(x % 2 == 0 && x) x /= 2, cnt2[i]++;
		while(x % 5 == 0 && x) x /= 5, cnt5[i]++;
		sum_2 += cnt2[i], sum_5 += cnt5[i];
	}
	for (int i = 0; i < n - k; i++) {
		int mi = 0, id = 0;
		for (int j = 0; j < n; j++) {
			if (!vis[j] && mi < min(sum_2 - cnt2[j], sum_5 - cnt5[j]))
				mi = min(sum_2 - cnt2[j], sum_5 - cnt5[j]), id = j;
		}
		vis[id] = 1, sum_2 -= cnt2[id], sum_5 -= cnt5[id];
	}
	cout<<min(sum_2,sum_5);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值