【UVA1368】DNA序列

原题传送门

题目大意

输入 mm 个长度均为 nn 的 DNA 序列,求一个 DNA 序列,该序列能满足到 mm 个序列的总距离最小。

两个等长字符串的距离定义为字符不同的的位置的个数,例如,ACGTACGTGCGAGCGA 的距离为 22(第 11、第 44 位置的字符不相同)。

数据范围:

4m50,4n1000,1t1004 \le m \le 50,4 \le n \le 1000,1 \le t \le 100

解题思路

简单的模拟题,本蒟蒻在模拟赛中玄学的 TLE (90pts),

然而,把数组开大就 AC 了。

由于字符串只包含 TTAAGGCC 四个字符,记录一下不就结束了吗?

但另一个坑点是:

如果有多个答案,输出字典序最小的那个。

这就要用几个 if 判断了。

最最最最后一个坑点:千万不能用 cincout !!!

AC CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long
int T, n, m;
char cc[51][2001];

signed main()
{
	scanf("%lld", &T);
	while(T--)
	{
		int ans = 0;
		scanf("%lld%lld", &n, &m);
		for(int i = 1; i <= n; ++i)
		{
			scanf("%s", cc[i]);
		}
		for(int i = 0; i < m; ++i)
		{
			int a = 0, b = 0, c = 0, d = 0;//ACGT
			int mmax = 0;
			for(int j = 1; j <= n; ++j)
			{
				if(cc[j][i] == 'T') a++;
				if(cc[j][i] == 'A') b++;
				if(cc[j][i] == 'G') c++;
				if(cc[j][i] == 'C') d++;
			}
			mmax = max(a, max(b, max(c, d)));
			//cout<<mmax<<endl;
			if(mmax == b) putchar('A'), ans = ans + a + c + d;
			else if(mmax == d) putchar('C'), ans = ans + a + b + c;
			else if(mmax == c) putchar('G'), ans = ans + a + b + d;
			else putchar('T'), ans = ans + b + c + d;
		}
		printf("\n%lld\n", ans);
	}
}
posted @   蒟蒻orz  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示