【模拟】相似度 (similar.pas/c/cpp)
2012-11-06 18:40
211 查看
相似度
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://blog.csdn.net/jiangzh7 */ #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; }
相关文章推荐
- 【模拟】相似度 (similar.pas/c/cpp)
- 【模拟 找规律】SHLQSH数(shlqsh.pas/c/cpp)
- 【模拟】贾老二的工件 jia.pas/c/cpp
- JZOJ(中山纪中) 1591. 【普及模拟】游戏(j5.pas/cpp)
- 【队列模拟】集卡片 card.pas/c/cpp
- jzoj 1731. 【10.5NOIP普及模拟】sum(sum.pas/cpp)
- 【队列模拟】集卡片 card.pas/c/cpp
- 【队列模拟】11月15日的快乐 happy.pas/c/cpp
- 【队列模拟】11月15日的快乐 happy.pas/c/cpp
- MZ test17# NOIP模拟题 # T1 第1题 时间计算(heaven.pas/cpp)[key.模拟]
- 【2014.8.17NOIP普及组模拟】【高精度乘法】公牛数学(bullmath.pas/c/cpp) //2018.2.2
- 【普及模拟】奇数统计(count.pas/cpp)//2018.1.31
- 【模拟】【栈】外星密码 password.pas/c/cpp
- 【模拟】贾老二的工件 jia.pas/c/cpp
- 【模拟】【栈】外星密码 password.pas/c/cpp
- 【模拟】第一题 分数化小数(fracdec.pas/c/cpp)
- jzoj 1730. 【10.5NOIP普及模拟】sort(sort.pas/cpp)
- 【NOIP模拟考一】水资源 first 海港的船只(ship.cpp)
- JZOJ(中山纪中) 1986. 【普及组模拟赛】作业(homework.pas/cpp)
- 【python】NLTK-02-相似度 频率 similar common_contexts count