一道模拟题,没有用什么特别的算法(非要说的话感觉是枚举),就是根据题目要求进行模拟求解。主要也可能是题目数据量较小,不会让人运行超时。
核心思路就是能交换就不要单独改变!
总体思路很简单,就是从碱基对不同的开始往后一个一个找。找到符合与之相对应的就将二者交换(程序中实际上只有后面的那个值被交换),如果找不到就将单个碱基自己改变(实际程序中自己也是没变的,只有答案加了1)。
#include <bits/stdc++.h>
using namespace std;
char swt(char c){
if (c == 'A') return 'T';
if (c == 'T') return 'A';
if (c == 'C') return 'G';
if (c == 'G') return 'C';
}
int main()
{
int n; cin >> n;
string s1, s2; cin >> s1 >> s2;
for (int i = 0; i < n; i++) s2[i] = swt(s2[i]);
int ans = 0;
char c;
for (int i = 0; i < n; i++){
int flag = 1;
if (s2[i] != s1[i]){
flag = 0;
c = s1[i];
for (int j = i + 1; j < n; j++){
if(s2[j] != s1[j] && s2[i] == s1[j] && s2[j] == c){
ans++;
flag = 1;
s2[j] = s2[i];
break;
}
}
}
if (flag == 0) ans++;
}
cout << ans;
return 0;
}