UVA1368 DNA序列 题解
一道字符串模拟题。
思路
-
输入 m 个字符串;
-
从第 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++;
}
-
分别在每一位比较各个字母出现次数的大小,输出当前位出现次数最多的字母(数量相等就输出字典排序靠前的字母);
-
用变量 ans 统计其他没有被输出的字母的出现次数;
-
结束循环,输出 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——

浙公网安备 33010602011771号