CF837D题解

CF837D题解

没有用的话

今天晚上在 CF 题库里随便选题选的,感觉还不错的题。

昨天就开始停自习了,但是一直在摆烂(悲,自从上个学期就这样了,非常怀念一年前的机房,风清气正,大家都在为打破弱校桎梏、取得前所未有的成绩的目标而努力学习,偶有摆烂,带来的只有深深的愧疚感和危险感(想到EZ、HZ的大佬就会觉得危险)

这题其实是我随便之中选的,从昨天开始我就在 CF 选一些 2000+ 左右的题水一水,其实打算做 pjudge 上之前 noip 的模拟赛的,但是由于摆烂没时间做了。

另外:洛谷的第一篇题解写的是真好(这不是废话)

思路

就是冲着 dp 的tag去的,所以第一开始就往 dp身上靠了。

考虑到是选出 k 个数,所以想到背包, 当前状态 fi,j,前 i 个,选 j 个,乘积 0 最多个数。

这样好像不行……我们考虑添状态维度

DP进阶:堆维度和删维度就是了。——鲁迅

增加维数。

我们拿到一道题且无从下手时,其正解一般是DP。 为什么我们做不出来?因为其中有很多很多因变量不受我们控制。也就是说,我们在考虑该状态转移的过程中应该尽量多的选择具有后效性的状态,而后再想着怎么优化降维。 ---luogu题解

此言得之!

我们可以从题中找到一些关于状态转移的信息:如何对末尾的 0 有更多贡献?我们可以考虑分解质因数,发现只有 2 和 5 可以对末尾的 0 的个数产生影响,而选的数分解质因数中的所有 2 的个数和所有 5 的个数,他们两个的最小值其实就是末尾 0 的个数。

考虑设计状态 fi,j,sum2,sum5,前 i 个数,选 j 个,其中质因数 2 有 sum2 个,5 有 sum5 个,是否可行。

然后……MLE了……

整体与部分的转化(即可行性转最优)。

我们在某题(BZOJ1079)可能会暴力出来一个1e9维的dp方程。不妨再想想:
可不可以把其中一个维度扔出来作为dp的含义呢?
很高兴的是,这道题就是那么优化的 ---luogu题解

设计状态 fi,j,sum2,表示 有 sum2 个2时5的个数,最后找 sum2fn,k,sum2 的最小值的最大值就行了。

状态转移就是背包的转移,不必多说。

Code

#include <bits/stdc++.h>
#define int long long
#define maxn 605
using namespace std;
inline int read() {
    int x = 0, f = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); }
    while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
    return x * f;
}
int n, m, sum;
int f[2][maxn][maxn * 10], a[maxn];
int get(int x, int p) {
	int res = 0;
	while (x % p == 0) {
		res++;
		x /= p;
	}
	return res;
}
signed main() {
	n = read(), m = read();
	memset(f, -1, sizeof(f));
	f[0][0][0] = 0;
	for (int i = 1; i <= n; i++) {
		a[i] = read();
		int s2 = get(a[i], 2), s5 = get(a[i], 5);
		sum += s2;
		for (int j = 0; j <= min(m, i); j++) {
			for (int k = 0; k <= sum; k++) {
				f[i & 1][j][k] = max(f[i & 1][j][k], f[(i - 1) & 1][j][k]);
				if (j > 0 && k >= s2 && ~f[(i - 1) & 1][j - 1][k - s2])
					f[i & 1][j][k] = max(f[i & 1][j][k], f[(i - 1) & 1][j - 1][k - s2] + s5);
			}
		}
	}
	int ans = 0;
	for (int i = 0; i <= sum; i++) 
		ans = max(ans, min(i, f[n & 1][m][i]));
	cout << ans;	
	
}

posted @   djc01  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
点击右上角即可分享
微信分享提示