列表

详情


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。

    现在给出两个RNA的碱基序列a和b,由字母AGCU组成,a和b序列等长,现在aRNA要进行复制操作,问bRNA需最少经过多少次操作形成aRNA的互补链。操作包含以下两种:
  1. 将bRNA上某一个碱基替换为其他碱基
  2. 将bRNA碱基序列中某两个互补碱基的位置互换

输入描述

第一行输入一个整数,表示共组用例。()
接下来组,每组第一行一个整数,表示碱基序列长度。(
下面两行分别表示碱基序列和碱基序列。(保证序列等长,且等于)

输出描述

输出共行,每行一个整数,表示最少的操作次数。

示例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)
    

上一题