原题
题目大意:
给你两个长度都为\(n\)的的\(01\)\(a,b\),现在你可以对\(a\)串进行如下两种操作:
1.交换位置\(i\)和位置\(j\),代价为\(|i-j|\)
2.反转位置\(i\) \((0->1, 1->0)\), 代价为\(1\)
问你将\(a\)变成\(b\)的最小代价是多少。
乍一看,像是dp。但是,仔细想一想,会发现只有在\(i\)\(j\)的距离为\(1\),且\(a[i] \neq b[i] \ and \ a[j] \neq b[i] \ and \ a[i] \neq a[j]\)时,直接交换才是最优的,因为当距离大于\(1\)且在这种情况下时,反转的代价仅为\(2\),不会比交换要差。其他情况下,若\(a[i]=b[j]\),不用管,否则直接反转。
我们只需要先扫一遍,把能直接交换的先换了,再扫一遍,加上还需要反转的数量就可以了。
代码如下:

 #include <bits/stdc++.h>

using namespace std;

string a, b;
int n, ans;

int main() {
	cin >> n;
	cin >> a >> b;
	for(int i = 0; i < n-1; i++)
		if(a[i] != b[i] && a[i+1] != b[i+1] && a[i] != a[i+1]) ans++, swap(a[i], a[i+1]);
	for(int i = 0; i < n; i++)
		if(a[i] != b[i]) ans++;
	cout << ans;
	return 0;
}

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-21
  • 2021-06-09
  • 2021-06-15
  • 2021-08-18
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-02-03
  • 2021-07-20
  • 2021-08-15
  • 2021-08-15
  • 2022-12-23
  • 2022-02-04
相关资源
相似解决方案