当前位置: 代码迷 >> 综合 >> Codeforces Round #712 (Div. 2) B. Flip the Bits
  详细解决方案

Codeforces Round #712 (Div. 2) B. Flip the Bits

热度:13   发布时间:2023-12-14 15:40:12.0

B. Flip the Bits

链接B. Flip the Bits

题目大意:

    给你两个只有01的字符串a和b,要求对a的前缀进行0->1和1->0的操作,使得a和b相同,注意,只有当a的那段前缀中的0和1数量相同时才可进行翻转。

解题思路

此题,蒟蒻一开始是不会的,参见了别人的代码~
首先,我们对a进行翻转的条件是0和1的数量相同,那么,我们用一句巧妙的代码来进行判断

 cnt += (a[i] == '1') - (a[i] == '0');

次数的cnt,初始值为0
当a[i]==1时,cnt+=1,
当a[i]==0时,cnt+=-1
也就是说,如果此时前缀的01数量相等的话,那么cnt=0
否则cnt不为0
后边的就简单了,a到b总是通过对前缀进行翻转,那么只要a和b不一样时,如果cnt=0,那么我们就可以翻转a,如果不为0的话,那么就不可能翻转得到b
代码如下:

#include <bits/stdc++.h>using namespace std;void solve() {
    int n;string a, b;cin >> n >> a >> b;a.push_back('0');b.push_back('0');int cnt = 0;for(int i = 0; i < n; i++) {
    cnt += (a[i] == '1') - (a[i] == '0');///统计0和1是否相等,若cnt==0则相等可翻转,否则不相等,不可翻转if((a[i] == b[i]) != (a[i + 1] == b[i + 1]) && cnt != 0) {
    ///两个相邻的数01位置交叉且目前不可翻转cout << "NO\n";return;}}cout << "YES\n";
}int main() {
    ios::sync_with_stdio(false);cin.tie(0);int te;cin >> te;while(te--) {
    solve();}
}

这道题虽然不是很难,但是也能体现出编程人的功底,我参考的这个写法就很简洁,如果是本人自己写,大概写不到这种程度。

共勉

  相关解决方案