UVA1368 DNA序列 题解

一道字符串模拟题。

思路

  1. 输入 m 个字符串;

  2. 从第 0 位到第 n - 1 位,统计每一个字符串该位的字母,并用变量存下个数,具体操作如下:

for (int i = 0; i < n; i++)
{
	t = a = g = c = 0;
	for (int j = 1; j <= m; j++)
	{
		if (str[j][i] == 'T') t++;
		if (str[j][i] == 'A') a++;
		if (str[j][i] == 'G') g++;
		if (str[j][i] == 'C') c++;
	}
  1. 分别在每一位比较各个字母出现次数的大小,输出当前位出现次数最多的字母(数量相等就输出字典排序靠前的字母);

  2. 用变量 ans 统计其他没有被输出的字母的出现次数;

  3. 结束循环,输出 ans。

以上就是此题思路。


代码奉上:

#include<bits/stdc++.h>
using namespace std;

string str[55];
int n, m, T;
int t, a, g, c;
int ans;
int maxx;

inline int read ()
{
	int x = 1, s = 0;
	char ch = getchar ();
	while (ch < '0' or ch > '9'){if (ch == '-') x = -1; ch = getchar ();}
	while (ch >= '0' and ch <= '9'){s = s * 10 + ch - '0'; ch = getchar ();}
	return x * s;
}

void mm (int t, int a, int g, int c)
{
	maxx = max (t, max (a, max (g, c)));
	if (maxx == a) 
	{
		putchar ('A');
		return;
	}
	if (maxx == c)
	{
		putchar ('C');
		return;
	} 
	if (maxx == g)
	{
		putchar ('G');
		return;
	} 
	if (maxx == t) 
	{
		putchar ('T');
		return;
	}
}

int main ()
{
	T = read ();
	while (T--)
	{
		ans = 0;
		t = a = g = c = 0;
		maxx = 0;
		m = read (), n = read ();
		for (int i = 1; i <= m; i++) 
		{
			char cc[2005];
			scanf ("%s", cc);
			str[i] = cc;	
		}	
		for (int i = 0; i < n; i++)
		{
			t = a = g = c = 0;
			for (int j = 1; j <= m; j++)
			{
				if (str[j][i] == 'T') t++;
				if (str[j][i] == 'A') a++;
				if (str[j][i] == 'G') g++;
				if (str[j][i] == 'C') c++;
			}
			int sum = t + g + a + c;
			mm (t, a, g, c);
			sum -= maxx;
			ans += sum;
		}	
		printf ("\n%d\n", ans);
	}
	return 0;
}

—— E n d End End——

posted @ 2022-03-25 07:25  pldzy  阅读(28)  评论(0)    收藏  举报