题意:两个长度为n只含有0和1的字符串a,b,求最少花费多少可以将a字符串变成b字符串
有两种操作:
1.将当前位置的字符取反(即0变成1,1变成0),花费1
2.将位置i和位置j的字符交换,花费为abs(i-j).
思路:
我们可以发现,位置i不相同,且位置j也不相同(j>i),如果交换后都可以对应位置与b相同,那么这两个位置有两种选择
自身取反,花费2,交换位置花费j-i;所以当i,j相邻时,选择交换方式较优,不相邻时选择自身取反的方式较优
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6+5;
char a[N],b[N];
int main(){
int n;
scanf("%d%s%s",&n,a,b);
a[n]=b[n]='1';
int ans=0;
for(int i=0;i<n;i++){
if(a[i]!=b[i]){
if(a[i+1]!=b[i+1]&&a[i]==b[i+1]){
ans++;
i++;
//第一种情况时
}
else ans++;//自身取反
}
}
printf("%d\n",ans);
return 0;
}