NC204566. 碱基配对
描述
引起此次肺炎疫情的病原体是一种新发现的冠状病毒,该病毒为单股正链RNA病毒。
正链RNA病毒通过RNA的自我复制进行繁殖。RNA由核糖核苷酸经磷酸二酯键缩合而成长链状分子。一个核糖核苷酸分子由磷酸,核糖和碱基构成。RNA的碱基主要有4种,即A腺嘌呤、G鸟嘌呤、C胞嘧啶、U尿嘧啶。
大家肯定都知道RNA的复制遵循碱基互补配对原则,即是指核酸分子中各核苷酸残基的碱基按A与T、A与U和G与C的对应关系互相以氢键相连的现象,在RNA的复制中表现为A-U,U-A,C-G,G-C。
输入描述
第一行输入一个整数,表示共组用例。()接下来组,每组第一行一个整数,表示碱基序列长度。()下面两行分别表示碱基序列和碱基序列。(保证和序列等长,且等于)
输出描述
输出共行,每行一个整数,表示最少的操作次数。
示例1
输入:
3 4 AGCU ACGU 3 AAA CCC 1 A A
输出:
1 3 1
JavaScript (V8 6.0.0) 解法, 执行用时: 64ms, 内存消耗: 7908K, 提交时间: 2020-03-22 15:51:05
var T=parseInt(readline()) var table={ "A":"U", "U":"A", "C":"G", "G":"C" } for(var times=0;times<T;times++){ var ans={ 0 : 0, "A":0, "U":0, "C":0, "G":0 } var lth=parseInt(readline()) var RNAa=readline() var RNAb=readline() for(var i=0;i<lth;i++){ if(RNAa[i]==RNAb[i]){ ans[RNAa[i]]++; }else if(table[RNAa[i]]==RNAb[i]){ }else{ ans[0]++; } } ans[0]=ans[0]+Math.max(ans["A"],ans["U"])+Math.max(ans["G"],ans["C"]) print(ans[0]) }
C 解法, 执行用时: 26ms, 内存消耗: 352K, 提交时间: 2022-01-12 16:01:57
#include<stdio.h> #include<math.h> int main() { int t,n,i,j,k,cnt; scanf("%d",&t); for(i=0;i<t;i++){ cnt=0; scanf("%d",&n); getchar(); char a[n+1],b[n+1],ch; gets(a); gets(b); for(j=0;j<n;j++){ if((a[j]=='A'&&b[j]!='U')||(a[j]=='U'&&b[j]!='A')||(a[j]=='C'&&b[j]!='G')||(a[j]=='G'&&b[j]!='C')){ if(a[j]==b[j]){ for(k=j+1;k<n;k++){ if(a[k]==b[k]&&(a[j]-'A'+b[k]-'A'==20||a[j]-'A'+b[k]-'A'==8)){ ch=b[j]; b[j]=b[k]; b[k]=ch; break; } } } cnt++; } } printf("%d\n",cnt); } return 0; }
C++ 解法, 执行用时: 16ms, 内存消耗: 536K, 提交时间: 2022-01-15 18:22:34
#include<bits/stdc++.h> using namespace std; template<typename T=int>T read(){T x;cin>>x;return x;} const int N=1E5+10; int a[N],b[4],c[82]; void solve() { int n=read(),ans=0; b[0]=b[1]=b[2]=b[3]=0; for(int i=1;i<=n;++i)a[i]=c[read<char>()]; for(int i=1;i<=n;++i) { int x=c[read<char>()],t=x^a[i]; if(t^1)++ans; if(!t)++b[x]; } cout<<ans-min(b[0],b[1])-min(b[2],b[3])<<'\n'; } int main() { ios_base::sync_with_stdio(0),cin.tie(0); c['A']=0,c['U']=1,c['G']=2,c['C']=3; for(int T=read();T--;solve()); }
Python3 解法, 执行用时: 574ms, 内存消耗: 4892K, 提交时间: 2022-04-03 22:21:40
import sys a = int(input()) for i in range(a): b,c,d=int(sys.stdin.readline()),sys.stdin.readline(),sys.stdin.readline() n1,n2a,n2u,n2c,n2g=0,0,0,0,0 for p in range(b): if c[p]+d[p] in ['AU','UA','CG','GC']: n1+=1 if c[p]+d[p] =="AA": n2a+=1 elif c[p]+d[p] =='UU': n2u+=1 elif c[p]+d[p] =='CC': n2c+=1 elif c[p]+d[p] =='GG': n2g+=1 n2=min(n2a,n2u)+min(n2c,n2g) print(b-n1-n2)