当前位置:主页 > 查看内容

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

发布时间:2021-04-30 00:00| 位朋友查看

简介:B. Flip the Bits 链接 B. Flip the Bits 题目大意 给你两个只有01的字符串a和b要求对a的前缀进行0-1和1-0的操作 使得a和b相同注意只有当a的那段前缀中的0和1数量相同时才可进行翻转。 解题思路 此题蒟蒻一开始是不会的参见了别人的代码~ 首先我们对a进行翻……

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();
    }
}

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

共勉

;原文链接:https://blog.csdn.net/QWERKSDFMKD/article/details/115435343
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐