思维CF1615C - Menorah

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了思维CF1615C - Menorah相关的知识,希望对你有一定的参考价值。

  • 博客主页: https://blog.csdn.net/qq_50285142
  • 👍欢迎点赞👍⭐️收藏⭐️❤️关注❤️留言 📝 如有错误,敬请指正
  • 🎈一看一温习,一码一收获🎈

题目链接:
https://codeforces.com/problemset/problem/1615/C

将字符串a转化为字符串b,选择a中1保持,其余全部反转,为一次操作。求转化为b的最小操作次数。


性质 固定同一个位置的1操作2次 固定不同位置的1操作2次 字符串不变 两个位置字符交换且其余位置不变

我们要把从a串状态变成b串:
计算不相等的位置中 a串1与0的数量是否相等,相等的话我们可以用交换操作达成目的此时答案是
交换次数 * 2

如果a串与b串中有同一位置等于1
我们就可以优先操作该位置,操作后该位置不变,之前与b串不相等的地方会相等,相等的地方会不等。
所以我们也可以计算原a串中相同位置的0与1的数量是否相等,相同1的数量要减1(减去用来翻转的第一次),如果相同,我们同样可以通过交换操作达成目标,此时答案是交换次数 * 2 + 我们第一次的1次翻转

操作偶数次 字符串a和b对应位置不同 操作偶数+1次 字符串a和b对应位置相同 字符串a中1个数和0个数相同 字符串a中1个数和0个数相同 可操作情况
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+5,M = 1e6+5;

void solve()

	int n;
	cin>>n;
	string a,b;
	cin>>a>>b;
	int s1=0,s2=0,d1=0,d2=0;
	int res = 1e9;	
	if(a == b)
	
		cout<<0<<endl;
		return;
	  
	for(int i=0;i<n;i++)
	
		if(a[i] != b[i])
		
			if(a[i] == '1') d1++;
			else d2++;
		
		else if(a[i]==b[i])
		
			if(a[i]=='1') s1++;
			else s2++;
		
	
	if(d1 == d2) res = min(res,d1 + d2);
	
	if(s1)
	
		s1 -- ;
		if(s1 == s2) res = min(res,s1 + s2 + 1);
	
	cout<<(res != 1e9 ? res : -1)<<endl;


int main()

	int t;
	cin>>t;
	while(t--) solve();
	return 0;
  

往期优质文章推荐

以上是关于思维CF1615C - Menorah的主要内容,如果未能解决你的问题,请参考以下文章

[递推] aw3777. 砖块(思维+递推+CF1271B)

[贪心] aw3774. 亮灯时长(思维+后缀和+代码细节+CF1000B)

[环图] aw3775. 数组补全(思维+构造+CF1283C)

[双指针] aw3784. 交换相邻元素(思维+算法优化+CF920C)

思维思维题——cf1350D

思维思维题——cf1350D