首页 > 其他分享 >CF837D Round Subset

CF837D Round Subset

时间:2024-11-19 16:29:56浏览次数:1  
标签:Subset 10 log int cnt5 maxn cnt2 CF837D Round

【刷题笔记】Round Subset

思路

考虑最朴素的可行性\(DP\),设 \(f_{i,j,x,y}\) 表示前 \(i\) 个数,选了 \(j\) 个数,其中有 \(x\) 个 \(5\) \(y\) 个 \(2\) 时是否合法,但是枚举时间复杂度为 \(O(n*k*n*log_5^{10^{18}}*n*log_2^{10^{18}})\) 即 \(O(n^3*k*log_5^{10^{18}}*log_2^{10^{18}})\)
考虑优化,将可行性 \(DP\) 改为最值 \(DP\) 设 \(f_{i,j,k}\) 表示前 \(i\) 个数, 选了 \(j\) 个,有 \(k\) 个 \(5\) 时 \(2\) 的最大个数,因为 \(log_2\) 比 \(log_5\) 大所以要优化掉 \(log_2\)
得到转移方程

\[f_{i,j,k}=max(f_{i-1,j-1,k-cnt5_i}+cnt2_i,f_{i,j,k}) \]

发现还能用滚动数组优化掉一维,得到最后方程

\[f_{j,k}=max(f_{j-1,k-cnt5_i}+cnt2_i,f_{j,k}) \]

注意初始化,要将 \(f\) 数组初始化为 \(-INF\) 不然会出现一些不合法方案

\(Code\)

#include<bits/stdc++.h>
#define maxn 5010
#define ll long long
using namespace std;
ll n, K, cnt2[maxn], cnt5[maxn], a[maxn], f[210][maxn];
ll ans = 0, tot = 0;
int main(){
	cin >> n >> K;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		while(a[i] && a[i] % 2 == 0){
			++cnt2[i];
			a[i] /= 2;
		}
		while(a[i] && a[i] % 5 == 0){
			++cnt5[i];
			a[i] /= 5;
		}
		tot += cnt5[i];
	}
	memset(f, -0x3f, sizeof(f));
	f[0][0] = 0;
	for(int i = 1; i <= n; i++){
	 	for(int j = K; j >= 1; j--){
			for(int k = cnt5[i]; k <= tot; k++){
				f[j][k] = max(f[j][k], f[j - 1][k - cnt5[i]] + cnt2[i]);
			}
		}
	}
	for(ll i = 1; i <= tot; i++){
		ans = max(ans, min(f[K][i], i));
	}
	cout << ans;
	return 0;
}

标签:Subset,10,log,int,cnt5,maxn,cnt2,CF837D,Round
From: https://www.cnblogs.com/GSNforces/p/18555107

相关文章

  • Educational Codeforces Round 156 (Rated for Div. 2) - VP记录
    A.SumofThree枚举即可,是否可行只与\(a,b,c\)模三的余数有关,所以随便小范围枚举一下\(a,b\)就行了(只枚举\(1,2,3\)可能会因为两数相同而误判),这样最不容易错。点击查看代码#include<cstdio>usingnamespacestd;intmain(){ intT;scanf("%d",&T); while(T--) ......
  • Public NOIP Round #6 D 排序 题解
    Description今天是YQH的生日,她得到了一个\(1\simn\)的排列作为礼物。YQH是一个有强迫症的女孩子,她希望把这个排列从小到大排序,具体的,她可以进行这样的操作:把\([1,n]\)分成若干个区间,假如是\(m\)段,依次为\([l_1,r_1],[l_2,r_2],\dots,[l_m,r_m]\),其中\(l_1=1,r_m=......
  • Codeforces Round 988 (Div. 3) E题解析
    E题题目链接CodeforcesRound988(Div.3)题目描述题目的思路根据题目的意思,我们可以推断出算法时间复杂度应该在O(N)对于这道题而言,我们可以分析下思路首先我们先从1~n的范围里面询问答案如果出现0就跳过,因为无序操作如果出现非0答案temp就记录下1~i的01序列的个数如果......
  • Codeforces Round 988 (Div. 3) A~D
    CodeforcesRound988(Div.3)A.Twice这个题就是简单的贪心题,在相同大小的元素里面,我们只能选择两个来对评分更新,所以最多能更新(相同元素的个数)/2次,记录相同元素的个数就行了//Problem:A.Twice//Contest:Codeforces-CodeforcesRound988(Div.3)//URL:https......
  • 牛客周赛 Round 67 A~F
    牛客周赛Round67A~F题解目录牛客周赛Round67A~F题解Preface所有代码前面的火车头ProblemA.排序危机ProblemB.小歪商店故事:卷ProblemC.小苯的计算式ProblemD.KProblemE.小苯的区间选数ProblemF.小Z的树迁移PostScriptPreface好久没v过牛客周赛了,但估计这场强度不高......
  • 题解:CF contest 2037 : [Codeforces Round 988 (Div. 3)] (A-E)
    ATwice题面Kinich醒来迎接新的一天的开始。他打开手机,查看邮箱,发现了一份神秘的礼物。他决定打开礼物的盒子。Kinich用\(n\)整数打开数组\(a\)。最初,Kinich的分数是\(0\)。他将执行任意次数的以下操作:—选择两个索引\(i\)和\(j\)\((1\leqi\lt;j\leqn)\),确......
  • Codeforces Round 988 (Div. 3)
    CodeforcesRound988(Div.3)总结A没啥好说的,用桶存出现次数。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>usingnames......
  • 牛客周赛 Round 68(A~E)
    比赛链接:https://ac.nowcoder.com/acm/contest/95928#question这次D题小细节搞了好久,越界了好几次,没想到赛后做E,发现还更简单的A.三途川的摆渡人(二)题面:小红这天来到了三途川,发现这里有一个摆渡人,名字叫小町。小町的职责是将一些灵魂运送到冥界。但小町非常喜欢偷懒,她经常在上......
  • Codeforces Round 987 (Div. 2) - 比赛总结
    Preface我是若只。A.PenchickandModernMonument先吃三发罚时。最优策略应当是把所有数都调成众数,然而我一开始就忙着往后面做,胡乱猜了个结论就WA了,又猜了一个又WA了,再猜了一个再WA了。点击查看代码constintN=105;intn,a[N];intmain(){ intT;read(T);......
  • NSSRound#12 Basic-ordinary forensics
    NSSRound#12Basic-ordinaryforensics[NSSRound#12Basic]ordinaryforensicsvol.py-fforensics.raw--profile=Win7SP1x64cmdscan找到了一个密码U_find_1tvol.py-fforensics.raw--profile=Win7SP1x64filescan|grepzip·提取这个压缩包vol.py-fforensics.raw--profi......