3904 DNA序列修正

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
map<char,int> mp  //判断是否能够进行互补配对,我用到方法是ASCII码的差值是否相等
{
  {'A',0},  //涉及到map键值对的定义,一个字符对应一个值,既然值不重要就进行一个重映射
  {'C',1},  //进而判断的条件是否为3;
  {'G',2},
  {'T',3}
};///map键值对的定义 
int main()
{
  int n;cin>>n;
  int cnt=0;
  string a,b;cin>>a>>b;//字符串的输入,ab同时定义,然后cin输入,也可以用getline
  for(int i=0;i<n;i++)  
  {
    if(mp[a[i]]+mp[b[i]]!=3) //判断如果不能进行碱基互补配对
    {
      for(int j=i+1;j<n;j++)//在第二条序列的后面进行搜索
      {//这样所有有问题的地方都会得到解决
        if(mp[a[i]]+mp[b[j]]==3&&mp[a[j]]+mp[b[i]]==3)//如果可以互换则互换
        {	
			    swap(b[i],b[j]);//我的做法不是用swap函数,而是用标记数组,不对原来的数组做真正的处理
        	break;
        } 
      }
       cnt++;//无论是否进行交换操作数都要+1;
    }
  }
  cout<<cnt<<endl;
  return 0;
}

 


 能过40%呢

思路:

能交换的交换,不能交换的地方修改。

先遍历数组,将有问题的地方标记出来,然后对于有问题的地方经过交换之后能否完成配对。

cnt-2,消除标记。同时ans+1;

最后输出ans加cnt,表示通过交换的次数和替换的次数的总和。

#include <bits/stdc++.h>
using namespace std;
bool a[1010]={};
bool check(char x,char y)
{
  int a=x-y;
  if(a=='A'-'T'||a=='T'-'A'||a=='C'-'G'||a=='G'-'C') return true ;
  else return false;

}
int main()
{
  int n;cin>>n;
  string s1;
  string s2;
  cin>>s1;
  cin>>s2;
  int cnt=0,ans=0;
  for(int i=0;i<n;i++)
  {
    if(check(s1[i],s2[i])) continue;
    else 
    {
      a[i]=true;//如果不成立的话标记数组
      cnt++;
    }
  }
  for(int i=0;i<n;i++)
    if(a[i]==1)//有问题的地方
      for(int j=n-1;j>=i;j--)
        if(a[j]&&check(s1[i],s2[j])&&check(s1[j],s1[i]))//如果有问题且进行交换之后可以
        {
          a[i]=a[j]=0;//清除标记
          cnt-=2;//同时少了2个有问题的地方
          ans++;//进行了一次操作,答案+1;
        }
  cout<<ans+cnt<<endl;
  return 0;
}

//将有问题的位置记录下来。
//能进行交换消除标记。
//不能进行交换的进行替换消除标记。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值