P10160 [DTCPC 2024] Ultra 题解
【题目描述】
给你一个 \(01\) 序列,你可以进行如下操作若干次(或零次):
- 将序列中形如 \(101\cdots01\) 的一个子串(即 \(1(01)^k\),\(k\ge 1\))替换成等长的 \(010\cdots10\)(即 \(0(10)^k\))。
你要操作使得 \(1\) 的个数尽可能少,输出最少的 \(1\) 的个数。
【思路】
一开始看到这道题不会做,问老师,于是:
于是开始自己造数据,把结论玩出来了。
首先考虑这样子的情况:A00B
,\(A,B\) 是一个 \(01\) 序列。我们不难发现,对于这种情况,\(A,B\) 不管怎么替换,都不可能将 \(A,B\) 连在一起。于是我们有了第一步,将整个串分割开,分割条件是出现两个及以上连续的 \(0\)。
现在我们得到了一大堆 \(01\) 序列,这些序列都没有两个及以上连续的 \(0\)。对于每一个序列,可以分为两种情况:
- \(111\cdots111\):对于全部都是 \(1\) 的串,我们无法对其进行操作,答案加上区间长度。
- \(111\cdots101\cdots111\):对于其中至少有一个 \(0\) 的串,我们一定有一种方法让他只剩下一个 \(1\),答案加 \(1\)。证明过程放在最后。
于是这道题就做完了。
嗯。
【Code】
#include <bits/stdc++.h>
using namespace std;
char s[1000005];
int n,ans;
//判断是否是区间开始
bool Is_start(int x){
if(x==1&&s[x]=='1') return true;
if(x==2&&s[x-1]=='0'&&s[x]=='1') return true;
if(x>=3&&s[x-2]=='0'&&s[x-1]=='0'&&s[x]=='1') return true;
return false;
}
//判断是否为区间结束
bool Is_end(int x){
if(s[x]=='1'&&s[x+1]=='0'&&s[x+2]=='0') return true;
return false;
}
//判断一个区间中是否有 0
bool No_zero(int l,int r){
for(int i=l;i<=r;i++){
if(s[i]=='0') return false;
}return true;
}
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
s[n+1]=s[n+2]='0';
int l=0,r=0;
for(int i=1;i<=n;i++){
if(Is_start(i)) l=i; //是区间开始
if(Is_end(i)){ //是区间结束
r=i;
if(No_zero(l,r)) ans+=r-l+1; //全部是 1,无法消去
else ans+=1; //其中有 0,消到一个
}
}
printf("%d",ans);
return 0;
}
【证明】
证明内容:一个至少包含一个 \(0\) 的 \(01\) 串,最后一定可以被消除到只剩一个 \(1\)
我们从这个 \(01\) 串最右边的那个 \(0\) 开始。
那么这个串可以表示为 \(1\cdots1110111 \cdots 1A\) 的形式,\(A\) 是一个 \(01\) 串。
\(\begin{array}{c}
\ \ \ \ \ \ \ \ {\color{Blue}1} \cdots {\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1} \cdots {\color{Blue}1}A \\
\Longrightarrow {\color{Blue}1} \cdots {\color{Blue}1}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1} \cdots {\color{Blue}1}A \\
\Longrightarrow {\color{Blue}1} \cdots {\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1} \cdots {\color{Blue}1}A \\
\Longrightarrow {\color{Blue}1} \cdots {\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0} \cdots {\color{Blue}1}A
\end{array}\)
在替换的这个串的左边会碰到这个串的边缘:
\(\begin{array}{c}
\ \ \ \ \ \ \ \ {\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0} \cdots A \\
\Longrightarrow {\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0} \cdots A \\
\Longrightarrow {\color{Blue}1}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0} \cdots A \\
\Longrightarrow {\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Red}0}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0} \cdots A \\
\Longrightarrow {\color{Red}0}{\color{Red}0}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Red}0}{\color{Red}0}{\color{Red}0}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0} \cdots A \\
\Longrightarrow {\color{Red}0}{\color{Red}0}{\color{Red}0}{\color{Red}0}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1} \cdots A \\
\end{array}\)
然后慢慢缩回来。
而它的右边则有两种情况:
碰到 \(1\),一起改变掉。
碰到 \(0\):
\(\begin{array}{c}
\ \ \ \ \ \ \ \ {\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Blue}1} \cdots A \\
\Longrightarrow {\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1}{\color{Red}0}{\color{Blue}1} \cdots A \\
\end{array}\)
P10160 [DTCPC 2024] Ultra 题解的更多相关文章
- JLOI2016 简要题解
「JLOI2016」侦查守卫 题意 有一个 \(n\) 个点的树,有 \(m\) 个关键点需要被监视.可以在其中一些点上插眼,在 \(i\) 号点上放眼需要花费 \(w_i\) 的代价,可以监视距离 ...
- [Luogu 2024] 食物链
[Luogu 2024] 食物链 几句随感 我依稀记得联赛前本来想做这题的时候. 当年啊弱到题目与标签就令我望而生畏. 还有翻阅很多遍那现在已经被遗弃的博客. 看到题解中「三倍数组」的字眼就怕难而放弃 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
随机推荐
- CodeForces Hello 2024 个人题解(A~C)
A. Wallet Exchange 时间限制: 1秒 内存限制: 256兆 输入: 标准输入 输出: 标准输出 Alice and Bob are bored, so they decide to ...
- 01.Android线程池实践基础
目录介绍 01.实际开发问题 02.线程池的优势 03.ThreadPoolExecutor参数 04.ThreadPoolExecutor使用 05.线程池执行流程 06.四种线程池类 07.exe ...
- Lifecycle详细分析
Lifecycle源码分析 目录介绍 01.Lifecycle的作用是什么 02.Lifecycle的简单使用 03.Lifecycle的使用场景 04.如何实现生命周期感知 05.注解方法如何被调用 ...
- 记录--7个Js async/await高级用法
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 7个Js async/await高级用法 JavaScript的异步编程已经从回调(Callback)演进到Promise,再到如今广泛使 ...
- [HTML、CSS]细节、经验
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/130134573 出自[进步* ...
- Games101-作业5
说明 本次作业主要实现Whitted-光线追踪,作业框架只需要我们编写两个部分,一个是求解观测光线--从摄像机到每个像素的向量:第二个是判断射线与三角形的交点. 求解观测光线 需要对每个像素求解在实际 ...
- GPTCache使用
1.概述 传统应用开发中,为了提升系统的查询性能,往往会在系统架构设计中加入缓存机制.在AI大模型领域,虽然功能非常强大,但是使用成本也是非常昂贵的,比如OpenAI的GPT-4按照token的个数来 ...
- 第一次画pcb学到的知识
第一次画pcb学到的知识 1. Typec (6针) 其中的CC1.CC2引脚为快充协议的引脚,用不到的时候串个5.1K的电阻接地s 2. AMS117降压电路 AMS1117芯片的输入电压都要一个1 ...
- JWT 安全令牌
1 package com.reliable.yang.utils; 2 3 import io.jsonwebtoken.Jwt; 4 import io.jsonwebtoken.JwtBuild ...
- Python爬取腾讯疫情实时数据并存储到mysql数据库
思路: 在腾讯疫情数据网站F12解析网站结构,使用Python爬取当日疫情数据和历史疫情数据,分别存储到details和history两个mysql表. ①此方法用于爬取每日详细疫情数据 1 impo ...