本题使用到的是贪心算法
题目的意思是,在原序列中找到一个序列,满足它与其他序列的差别最小
需要注意的地方:输出字典序最小的情况
正确代码
#include<stdio.h>
#define max(a, b) ((a)>(b)?(a):(b)) //如果a>b,就a,否则b
int main()
{
int N;
int j,k; //j表示有几行,k表示有几个
int n,m; //用作循环
int cnt_A,cnt_C,cnt_G,cnt_T; //对A,C,G,T进行计数
int dif; //记录不同的字母的总个数
int max_all; //记录出现次数最多的那个字母的次数
scanf("%d",&N);
char a[1005][1005];
while(N--)
{
scanf("%d %d",&j,&k);
//输入
for(n=0;n<j;n++)
{
scanf("%s",a[n]);
}
//处理
//一竖行一竖行地进行比较
dif=0;
for(m=0;m<k;m++)
{
//下面这个循环,循环一次,就相当于走了一个竖行,所以要从这个地方开始计数了
cnt_A=0;cnt_C=0;cnt_G=0;cnt_T=0;
for(n=0;n<j;n++)
{
if(a[n][m]=='A') cnt_A++;
if(a[n][m]=='C') cnt_C++;
if(a[n][m]=='G') cnt_G++;
if(a[n][m]=='T') cnt_T++;
}
//从里面找到一个最大的数,然后直接输出
max_all=max(max(max(cnt_A, cnt_C), cnt_G),cnt_T);
if(max_all==cnt_A) { printf("A"); dif=dif+cnt_C+cnt_G+cnt_T; }
else if(max_all==cnt_C) { printf("C"); dif=dif+cnt_A+cnt_G+cnt_T; }
else if(max_all==cnt_G) { printf("G"); dif=dif+cnt_C+cnt_A+cnt_T; }
else if(max_all==cnt_T) { printf("T"); dif=dif+cnt_C+cnt_G+cnt_A; }
}
printf("\n");
printf("%d\n",dif);
}
return 0;
}
值得学习的地方:
1.二维数组的输入输出
2.三目运算符的使用 三目运算符的用法