[题解]CF1746B Rebellion

思路

首先我们需要看到题目一个特殊的地方:这个序列中只存在 01

那么,我们不难发现最终的答案一定是形如下面的序列:0,,0,1,,1

知道了这些,就很好想了。我们从后往前枚举,如果当前一位为 0 了,就从 lasti 扫一遍,如果有 1 将最靠前的 1 修改掉,否则直接结束。(其中 last 表示上一次修改的值,这样可以减少时间复杂度)

这里运用一种贪心的思想,我们一定是要修改最靠前的,因为如果没成立,那么最靠前的是一定是需要修改的。

Code

#include <bits/stdc++.h>  
#define re register  
  
using namespace std;  
  
const int N = 1e5 + 10;  
int T,n,ans;  
int arr[N];  
  
inline int read(){  
    int r = 0,w = 1;  
    char c = getchar();  
    while (c < '0' || c > '9'){  
        if (c == '-') w = -1;  
        c = getchar();  
    }  
    while (c >= '0' && c <= '9'){  
        r = (r << 3) + (r << 1) + (c ^ 48);  
        c = getchar();  
    }  
    return r * w;  
}  
  
int main(){  
    T = read();  
    while (T--){  
        int last = 1;  
        ans = 0;  
        n = read();  
        for (re int i = 1;i <= n;i++) arr[i] = read();  
        for (re int i = n;i;i--){//倒序枚举   
            if (!arr[i]){//当前位置为 0   
                for (re int j = last;j <= i;j++){//从 last ~ i 扫一遍   
                    if (arr[j]){//有 1   
                        last = j;//更新   
                        break;//提前结束   
                    }  
                }  
                if (!arr[last]) break;//没有直接结束   
                arr[last] = 0;//修改(标记)   
                ans++;  
            }  
        }  
        printf("%d\n",ans);  
    }  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18264810

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示