A1051. DNA序列

A1051. DNA序列
时间限制: 1.0s   内存限制: 512.0MB  
问题描述
  人类基因组计划的第一阶段于2000年6月26日胜利结束,我国的科研工作者圆满地完成了其中的1%的测序工作。
  众所周知,对于任意两个人来说,他们的染色体上的DNA序列大部分是相同的(否则就不是同一物种了),但是总会有少数碱基对不相同(否则世界上的人长得都一模一样了)。碱基的不同是由于基因的变异引起的。例如在某个人的DNA序列中,一位点上A突变成G。但每个人的DNA序列的变异位置都是不尽相同的。这样,对于大部分位点来说,很有可能是这么一种情况:大部分人在这个位点上的碱基是一致的(因为没有发生变异),少数人具有不同的碱基(因为发生了变异)。
  这样就给我们一个启发:在测序的过程中,如果仅仅使用一个人的样本的话,在很多位点上测出的结果就不具有代表性;如果能够测出多个人的序列,那么就有可能“整合”出一段具有人类共性的序列出来,这样更有利于研究。
  比如说,我们要测人的某一段的DNA序列,得到了4个人的样本:
  AAAGGCCT
  AGAGCTCT
  AAGGATCT
  AAACTTCT

  按照如下:
  1、 取出在每一个位置上出现次数最多的碱基作为整合后该位置上的碱基
  2、 如果有一个位置上出现次数最多的碱基不止一种,那么在出现次数最多的碱基中,优先选择A,其次C,再次G,最后T。
  按照上边的规则,整合后的序列为:
  AAAGATCT
输入格式
  输入数据的第一行是一个数字N(2<=N<=10),代表DNA序列的个数
  接下来有N行,每行都是一个由AGCT组成的字符串,代表每个DNA序列,保证这些序列拥有相同的长度
  序列的长度在2到100之间
输出格式
  仅输出一个字符串,代表整合后的DNA序列
样例输入
4
AAAGGCCT
AGAGCTCT
AAGGATCT
AAACTTCT
样例输出
AAAGATCT

法一:(OJ通过)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main(){
  5.     int n;
  6.     while((scanf("%d",&n))!=EOF){
  7.         char data[10][101];
  8.         char ans[5]="ACGT";
  9.         int i=0,j=0,len=0;
  10.         for(i=0;i<n;i++){
  11.             scanf("%s",data[i]);
  12.         }
  13.         len=strlen(data[0]);
  14.         for(j=0;j<len;j++){
  15.             int max=0,count=0,tmp[4]={0};
  16.             for(i=0;i<n;i++){
  17.                 if(data[i][j]=='A') tmp[0]++;
  18.                 if(data[i][j]=='C') tmp[1]++;
  19.                 if(data[i][j]=='G') tmp[2]++;
  20.                 if(data[i][j]=='T') tmp[3]++;
  21.             }
  22.             for(int k=0;k<4;k++){
  23.                 if(max<tmp[k]){
  24.                     max=tmp[k];
  25.                     count=k;
  26.                 }
  27.             }
  28.             printf("%c",ans[count]);
  29.         }
  30.     }
  31.     system("pause");
  32.     return 0;
  33. }


法二(OJ是编译错误,但VS执行没问题)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){
  4.     int n;
  5.     while((scanf("%d",&n))!=EOF){
  6.         char data[10][100];
  7.         int i,j,tmp[100][4]={0};
  8.         getchar();
  9.         for(i=0;i<n;i++){
  10.             j=0;
  11.             do{
  12.                 scanf("%c",&data[i][j++]);
  13.                 if(data[i][j-1]=='A')   tmp[j-1][0]++;
  14.                 if(data[i][j-1]=='C')   tmp[j-1][1]++;
  15.                 if(data[i][j-1]=='G')   tmp[j-1][2]++;
  16.                 if(data[i][j-1]=='T')   tmp[j-1][3]++;
  17.             }while(data[i][j-1]!='\n');
  18.         }
  19.         for(i=0;i<j-1;i++){
  20.             int t=0,ans=0;
  21.             for(int k=0;k<4;k++){
  22.                 if(t<tmp[i][k]){
  23.                     t=tmp[i][k];
  24.                     ans=k;
  25.                 }
  26.             }
  27.             switch(ans){
  28.                 case 0:
  29.                     printf("A");
  30.                     break;
  31.                 case 1:
  32.                     printf("C");
  33.                     break;
  34.                 case 2:
  35.                     printf("G");
  36.                     break;
  37.                 case 3:
  38.                     printf("T");
  39.                     break;
  40.             }
  41.         }
  42.     }
  43.     system("pause");
  44.     return 0;
  45. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值