【模拟】相似度 (similar.pas/c/cpp)

相似度
similar.pas/c/cpp

问题描述:

有两个长度相等的DNA序列(只包含A,T,G,C的字符串),我们想知道它的相似度,它的相似度是这样定义的。

首先相似度为0。

若在对应位置出现A与A,则相似度增加1513

若在对应位置出现A与T,则相似度增加666

若在对应位置出现T与T,则相似度增加2324

若在对应位置出现T与G,则相似度增加11

若在对应位置出现T与C,则相似度增加123

若在对应位置出现G与G,则相似度增加3999

若在对应位置出现G与C,则相似度增加521

若在对应位置出现G与A,则相似度增加423

若在对应位置出现C与C,则相似度增加4423

若在对应位置出现C与A,则相似度增加2

 

输入:

第一行一个数n,表示DNA序列的长度。

第二,三行分别有一个长度为n的字符串,表示两个DNA序列。

 

输出:

一个整数ans,表示相似度。

 

输入样例:

4

ATGC

ATGC

 

输出样例:

12259

 

数据范围:

n<=1000000

 

 

这一题没什么算法可言,主要注意A-T和T-A这些都是一种情况,直接4*4=16个 if 就可以解决问题

如果嫌16个 if 的程序不好看的话,可以写一个模块,然后在模块里面把小的排前面,比如T-A就处理成A-T,然后也需要4+3+2+1=10个 if 语句

如果还觉得不好看,这里推荐一种在usaco中学到的方法,把ATCG分别用1,2,4,8标号,那么任意两个相加的和都不同,就可以预处理出来,然后直接用即可,有兴趣的可以自己试试

C++ Code

/*
C++ Code
http://oijzh.cnblogs.com
*/
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define MAXN 1000010

typedef long long LL;
char a[MAXN],b[MAXN];
int n;

int main()
{
    freopen("similar.in","r",stdin);
    freopen("similar.out","w",stdout);
    scanf("%d",&n);
    gets(a);//跳过空行
    gets(a);gets(b);
    LL ans=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]=='A')
        {
            if(b[i]=='A'){ans+=1513;continue;}
            else if(b[i]=='T'){ans+=666;continue;}
            else if(b[i]=='G'){ans+=423;continue;}
            else if(b[i]=='C'){ans+=2;continue;}
        }
        else if(a[i]=='T')
        {
            if(b[i]=='A'){ans+=666;continue;}
            else if(b[i]=='T'){ans+=2324;continue;}
            else if(b[i]=='G'){ans+=11;continue;}
            else if(b[i]=='C'){ans+=123;continue;}
        }
        else if(a[i]=='G')
        {
            if(b[i]=='A'){ans+=423;continue;}
            else if(b[i]=='T'){ans+=11;continue;}
            else if(b[i]=='G'){ans+=3999;continue;}
            else if(b[i]=='C'){ans+=521;continue;}
        }
        else if(a[i]=='C')
        {
            if(b[i]=='A'){ans+=2;continue;}
            else if(b[i]=='T'){ans+=123;continue;}
            else if(b[i]=='G'){ans+=521;continue;}
            else if(b[i]=='C'){ans+=4423;continue;}
        }
    }
    cout<<ans;
    return 0;
}

  

 

posted @ 2012-10-22 08:01  jiangzh  阅读(410)  评论(0编辑  收藏  举报