链接: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);
}