D. Binary Cut

题目描述:

给你一段01串,请你将所有0放在1前面,但只能是一块一块的移动,请你求出分块的最小数目
1010101 ⇒ 1 ∣ 01 ∣ 0 ∣ 1 ∣ 0 ∣ 1 0 ∣ 0 ∣ 01 ∣ 1 ∣ 1 ∣ 1 1010101 \Rightarrow 1 |01|0|1|0|1 \\ 0|0|01|1|1|1 10101011∣01∣0∣1∣0∣10∣0∣01∣1∣1∣1

思路:

此题思路就是除了第一个 01 串算 1 次 , 其余全部算 2 次 1010101 ⇒ 1 ∣ 01 ∣ 0 ∣ 1 ∣ 0 ∣ 1 假设不这么分就会出现 2 个类似 0...1 的串这样的串无论如何都不能拼成所有 0 在 1 前面的串 即分成 1 ∣ 01 ∣ 01 ∣ 0 ∣ 1 , 不管怎么样都无法拼成题意 但这样代码不太好写 , 我们反过来想 , 先都切割 , 如果存在 01 串就将切割数减一 此题思路就是除了第一个01串算1次,其余全部算2次\\ 1010101 \Rightarrow 1 |01|0|1|0|1\\ 假设不这么分就会出现2个类似0...1的串这样的串无论如何都不能拼成所有0在1前面的串\\ 即分成1|01|01|0|1,不管怎么样都无法拼成题意\\ 但这样代码不太好写,我们反过来想,先都切割,如果存在01串就将切割数减一 此题思路就是除了第一个01串算1,其余全部算210101011∣01∣0∣1∣0∣1假设不这么分就会出现2个类似0...1的串这样的串无论如何都不能拼成所有01前面的串即分成1∣01∣01∣0∣1,不管怎么样都无法拼成题意但这样代码不太好写,我们反过来想,先都切割,如果存在01串就将切割数减一

代码:

#include <bits/stdc++.h>

using namespace std;

int t;
string s;

int main(){
    cin >> t;
    while(t--){
        cin >> s;
        int n=s.size(),res=1;
        bool flag=0;
        for(int i=0;i<n-1;i++){
            res+=(s[i]!=s[i+1]);//如果是分界线,切割数加一
            flag|=(s[i]=='0' && s[i+1]=='1');//如果存在一个01串,就在结果的时候减一
        }
        cout << res-flag << endl;
    }
    return 0;
}
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值