CF1875D Jellyfish and Mex

本文介绍了一个编程问题,如何在整数数组中通过删除数字以获得最小答案,运用了动态规划和mex(最小未出现元素)的概念。

去洛谷看我的博客

思路

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

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

所以我们可以考虑统计所有数字的数量,记为 n u m i num_i numi,来计算删完某个数字的最小答案,记为 a n s i ans_i ansi

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

所以我们只需要倒着求 a n s i ans_i ansi 即可,最后的答案是 a n s 0 ans_0 ans0

另外,统计 mex ⁡ \operatorname{mex} mex 以内的数即可,大于 mex ⁡ \operatorname{mex} mex 的数都是无用的。并且,在这个方法没有删除的数字就最后挨个删除就好,反正 mex ⁡ \operatorname{mex} mex 都是 0 0 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;
}
### Jellyfish 工具的使用教程 Jellyfish 是一款用于高效计数 k-mers 的生物信息学工具,广泛应用于基因组数据分析。以下是关于其使用的详细说明: #### 安装过程 为了正确安装 Jellyfish,可以按照以下方式操作[^2]: ```bash wget -c https://github.com/gmarcais/Jellyfish/releases/download/v2.3.1/jellyfish-2.3.1.tar.gz tar -zxvf jellyfish-2.3.1.tar.gz mkdir jellyfishlocation cd jellyfish-2.3.1 ./configure --prefix=/jellyfishlocation make -j 4 make install ``` 完成上述步骤后,Jellyfish 将被成功安装到指定路径 `/jellyfishlocation`。 #### 基本概念 Jellyfish 主要功能是对 DNA 序列中的 k-mers 进行统计分析。k-mer 表示长度为 `k` 的连续子序列,在基因组研究中具有重要意义[^1]。 #### 使用方法 Jellyfish 提供了一系列命令行选项来执行不同的任务。常见的用法如下所示: 1. **构建 k-mer 统计表** 构建输入 FASTA 文件的 k-mer 频率表。 ```bash jellyfish count -m 21 -s 100M -t 8 input.fasta -o output.jf ``` 参数解释: - `-m`: 设置 k-mer 的大小 (此处为 21)。 - `-s`: 指定哈希表的最大内存占用量 (单位为字节, 此处为 100MB)。 - `-t`: 并行线程数量 (此处为 8)。 - `-o`: 输出文件名。 2. **查询 k-mer 频率** 查询特定 k-mer 出现的频率。 ```bash jellyfish query output.jf ACGTACGTACGTACGTACGT ``` 3. **导出 k-mer 列表** 导出完整的 k-mer 和对应的频次列表。 ```bash jellyfish dump -c -t output.jf > kmers.txt ``` 参数解释: - `-c`: 包含计数值。 - `-t`: 输出纯文本格式。 #### Python 库支持 除了作为独立工具外,还存在名为 `jellyfish` 的 Python 库,主要用于字符串匹配和模糊比较[^3]。该库的功能与生物信息学无关,而是专注于自然语言处理领域中的相似度计算。例如: ```python import jellyfish print(jellyfish.levenshtein_distance('hello', 'hallo')) # 计算编辑距离 print(jellyfish.soundex('Smith')) # 获取音码表示 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值