【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 @ 2021-08-04 16:46  蒟蒻orz  阅读(1)  评论(0编辑  收藏  举报  来源