首页 > 其他分享 >CF1875D Jellyfish and Mex

CF1875D Jellyfish and Mex

时间:2023-10-01 10:34:19浏览次数:34  
标签:删除 5005 CF1875D mex num ans operatorname Mex Jellyfish

思路

看到 \(n\) 的范围只有 \(5000\),并且 \(\sum n\) 的范围也是 \(5000\),所以可以考虑 \(n^2\) 的做法。

每次操作肯定都是一次性删完某个数字,如果删除某个数字删一半又去删别的数字,答案肯定会变大。

所以我们可以考虑统计所有数字的数量,记为 \(num_i\),来计算删完某个数字的最小答案,记为 \(ans_i\)。

那么我们可以考虑用大于 \(i\) 的 \(j\) 来更新 \(ans_i\),\(j\) 代表上一次删除的是 \(j\),所以当前的 \(\operatorname{mex}\) 应该就是 \(j\),那么删除 \(i\) 得到的值应该是 \((num_i-1)\times j+i\),因为删除的前 \((num_i-1)\) 次的 \(\operatorname{mex}\) 是 \(j\),最后一次是 \(i\)。

所以我们只需要倒着求 \(ans_i\) 即可,最后的答案是 \(ans_0\)。

另外,统计 \(\operatorname{mex}\) 以内的数即可,大于 \(\operatorname{mex}\) 的数都是无用的。并且,在这个方法没有删除的数字就最后挨个删除就好,反正 \(\operatorname{mex}\) 都是 \(0\) 没有影响。

AC code

#include<bits/stdc++.h>
using namespace std;
long long T,n,a[5005],now,num[5005],dp[5005][5005],ans[5005];
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld",&n),now=num[0]=0;
		for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
		sort(a+1,a+n+1);//排序
		for(int i=1;i<=n;++i)
		{
			if(a[i]==now) ++num[now];//统计num,now最后就是mex
			else if(a[i]==now+1&&num[now]) num[++now]=1;
			else break;
		}
		if(!num[0]){printf("0\n");continue;}//mex最开始就是0
		ans[now+1]=0;//预处理
		for(int i=now;i>=0;--i)
		{
			ans[i]=0x3f3f3f3f;//赋初值
			for(int j=i+1;j<=now+1;++j) ans[i]=min(ans[i],ans[j]+(num[i]-1)*j+i);//更新答案
		}
		printf("%lld\n",ans[0]);
	}
	return 0;
}

标签:删除,5005,CF1875D,mex,num,ans,operatorname,Mex,Jellyfish
From: https://www.cnblogs.com/One-JuRuo/p/17738632.html

相关文章

  • CF1875C Jellyfish and Green Apple
    思路首先我们可以考虑把能分的都先分了,再选择去切剩下的苹果。那么我们只需要考虑苹果数量少于人数的情况,每个人能分的苹果都必然少于目前的单个苹果,所以每个苹果都必须切一刀,那么答案数就会增加当前的数量,再把能分的都分了,重复这一过程,直到分完为止。这样去切一定是最优的。那......
  • 题解 CF1875D【Jellyfish and Mex】
    显然,除非\(\operatorname{mex}a=0\),否则不会删除\(>\operatorname{mex}a\)的数。而\(\operatorname{mex}a=0\)时不对答案产生贡献,因此任意时刻我们都可以忽略\(a\)中\(>\operatorname{mex}a\)的数。又显然,一旦我们开始删一个数,就会先把所有与之相等的数删光。否则,设最先......
  • COMException: 检索 COM 类工厂中 CLSID 为 {DB8CBF1C-D6D3-11D4-AA51-00A024EE30BD}
    没有注册类(异常来自HRESULT:0x80040154(REGDB_E_CLASSNOTREG)) "没有注册类(异常来自HRESULT:0x80040154(REGDB_E_CLASSNOTREG))"一般有两种情况,我最近做项目都遇到了》第一种:(生成平台的问题) 解决方法:在项目属性里设置“生成”=>“目标平台”为x86而不是默认的......
  • CF1867C Salyg1n and the MEX Game
    思路看着无从下手,实际上又是一道诈骗题。假设原数列不存在\(0\),那么我们可以直接加入\(0\),然后游戏结束,假设答案是\(k\)。那么,如果我们选择加入\(k\),来试图让答案变大,那么Bob就会移除一个数,最优的话是\(1\),这样的话,你无论加入\(1\)还是\(0\),答案都不会超过\(1\),于是......
  • debezium报错:Caused by: io.debezium.DebeziumException:whose schema isn‘t known t
    debezium报错:Causedby:io.debezium.DebeziumException:whoseschemaisn’tknowntothisconnector“trace”:"org.apache.kafka.connect.errors.ConnectException:Anexceptionoccurredinthechangeeventproducer.Thisconnectorwillbestopped.Causedby:io.......
  • 【CF1364C】Ehab and Prefix MEXs(构造)
    题目大意:给出长度为\(n(1\len\le10^5)\)的数组\(a\),构造数组\(b\)使得\(a_i=MEX\{b_1,b_2,...,b_1\}\)首先考虑当\(b_1,b_2,...,b_n\)为什么数时,\(a_n=MEX\{b_1,b_2,...,b_n\}\)。然后再考虑当\(b_1,b_2,...,b_{n-1}\)为什么数时,\(a_{n-1}=MEX\{b_1,b_2,...,b_{n-1}\}\)。......
  • 无涯教程-JavaScript - IMEXP函数
    描述IMEXP函数以x+yi或x+yj文本格式返回复数的指数。复数的指数为-$$e^{((x+yi)}=e^xe^{yi}=e^x(\cosy+i\siny)$$语法IMEXP(inumber)争论Argument描述Required/OptionalInumberAcomplexnumberforwhichyouwanttheexponential.Requir......
  • 信息: org.jbpm.JbpmException: closed JbpmContext in different order then they we
    刚接触jbpm 刚才遇到这个错误:closedJbpmContextindifferentorderthentheywerecreated...checkyourtry-finally'saroundJbpmContextsblocks我百思不得其解,网上说是hibernate的session没关闭,在搜索也就是javaeye那几个。查看了源代码有这句话:if(jbpmContext!=......
  • 数据结构维护 mex 总结
    P4137solution1:我最初做这题是莫队,这是一道练习莫队+值域分块的好题。莫队的时候记录两个东西,\(b_i\)表示\(i\)在当前出现的次数,\(c_i\)表示值域第\(i\)块中有出现的数的个数。显然\(b,c\)都是可以满足莫队\(O(1)\)移动指针。而后查询枚举值域块,令\(len_i\)表示......
  • C. MEX Repetition
    C.MEXRepetitionYouaregivenanarray$a_1,a_2,\ldots,a_n$ofpairwisedistinctintegersfrom$0$to$n$.Considerthefollowingoperation:consecutivelyforeach$i$from$1$to$n$inthisorder,replace$a_i$with$\operatorname{MEX}(a_1,a_2,......