#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;
}
//将有问题的位置记录下来。
//能进行交换消除标记。
//不能进行交换的进行替换消除标记。

1334

被折叠的 条评论
为什么被折叠?



