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
众所周知,对于任意两个人来说,他们的染色体上的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之间
接下来有N行,每行都是一个由AGCT组成的字符串,代表每个DNA序列,保证这些序列拥有相同的长度
序列的长度在2到100之间
输出格式
仅输出一个字符串,代表整合后的DNA序列
样例输入
4
AAAGGCCT
AGAGCTCT
AAGGATCT
AAACTTCT
AAAGGCCT
AGAGCTCT
AAGGATCT
AAACTTCT
样例输出
AAAGATCT
法一:(OJ通过)
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main(){
- int n;
- while((scanf("%d",&n))!=EOF){
- char data[10][101];
- char ans[5]="ACGT";
- int i=0,j=0,len=0;
- for(i=0;i<n;i++){
- scanf("%s",data[i]);
- }
- len=strlen(data[0]);
- for(j=0;j<len;j++){
- int max=0,count=0,tmp[4]={0};
- for(i=0;i<n;i++){
- if(data[i][j]=='A') tmp[0]++;
- if(data[i][j]=='C') tmp[1]++;
- if(data[i][j]=='G') tmp[2]++;
- if(data[i][j]=='T') tmp[3]++;
- }
- for(int k=0;k<4;k++){
- if(max<tmp[k]){
- max=tmp[k];
- count=k;
- }
- }
- printf("%c",ans[count]);
- }
- }
- system("pause");
- return 0;
- }
法二(OJ是编译错误,但VS执行没问题)
- #include <stdio.h>
- #include <stdlib.h>
- int main(){
- int n;
- while((scanf("%d",&n))!=EOF){
- char data[10][100];
- int i,j,tmp[100][4]={0};
- getchar();
- for(i=0;i<n;i++){
- j=0;
- do{
- scanf("%c",&data[i][j++]);
- if(data[i][j-1]=='A') tmp[j-1][0]++;
- if(data[i][j-1]=='C') tmp[j-1][1]++;
- if(data[i][j-1]=='G') tmp[j-1][2]++;
- if(data[i][j-1]=='T') tmp[j-1][3]++;
- }while(data[i][j-1]!='\n');
- }
- for(i=0;i<j-1;i++){
- int t=0,ans=0;
- for(int k=0;k<4;k++){
- if(t<tmp[i][k]){
- t=tmp[i][k];
- ans=k;
- }
- }
- switch(ans){
- case 0:
- printf("A");
- break;
- case 1:
- printf("C");
- break;
- case 2:
- printf("G");
- break;
- case 3:
- printf("T");
- break;
- }
- }
- }
- system("pause");
- return 0;
- }