首页 > 其他分享 >P10160 [DTCPC 2024] Ultra 题解

P10160 [DTCPC 2024] Ultra 题解

时间:2024-02-28 19:55:16浏览次数:18  
标签:Blue color 题解 2024 cdots && Longrightarrow Ultra Red

【题目描述】

给你一个 \(01\) 序列,你可以进行如下操作若干次(或零次):

  • 将序列中形如 \(101\cdots01\) 的一个子串(即 \(1(01)^k\),\(k\ge 1\))替换成等长的 \(010\cdots10\)(即 \(0(10)^k\))。

你要操作使得 \(1\) 的个数尽可能少,输出最少的 \(1\) 的个数。

【思路】

一开始看到这道题不会做,问老师,于是:

Niveton

于是开始自己造数据,把结论玩出来了。

首先考虑这样子的情况: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}\)

标签:Blue,color,题解,2024,cdots,&&,Longrightarrow,Ultra,Red
From: https://www.cnblogs.com/Sundar-2022/p/18031341

相关文章

  • 数据类型拓展与面试题解读
    整数拓展进制:在平时咱们生活中经常见到的例如通用于电脑识别的二进制、咱们生活中常用的十进制、工作中常见的八进制与十六进制。二进制:通常会以0b开头十进制:咱们生活中的数字八进制:通常以0开头十六进制:通常以0x开头​ 浮点数拓展(float、double)试题举例银行......
  • 2024/02/27
    packageorg.example.schooltest;importDAO.SchoolDAO;importDAO.liushuiDAO;importbean.LiuShui;importbean.School;importjakarta.servlet.annotation.WebServlet;importjakarta.servlet.http.HttpServlet;importjakarta.servlet.http.HttpServletRequest;i......
  • 2024/02/26
    <%@pageimport="bean.School"%><%@pageimport="java.util.List"%><%--CreatedbyIntelliJIDEA.User:龚涵彬Date:2024/2/27Time:15:11TochangethistemplateuseFile|Settings|FileTemplates.--%><......
  • Codeforces Round 929 (Div. 3) 题解(D-G)
    比赛链接:https://codeforces.com/contest/1933官解暂未放出。质量不错的一场D3。CF1933D.TurtleTenacity:ContinualMods题意将数组\(a_{1..n}\ge1\)重排,问是否能使\(((a_1\mathbin{\rmmod}a_2)\mathbin{\rmmod}a_3)\cdots\mathbin{\rmmod}a_n\ne0\)......
  • 2024/2/20
    在js中,有很多种的事件监听常见的鼠标事件监听事件名事件描述onclick当鼠标单机某个对象ondblclick当鼠标双击某个对象onmousedown当某个鼠标按键在某个对象上被按下onmouseup当某个鼠标按键在某个对象上被松开onmousemove当某个鼠标按键在某个对象上被移动onmouseenter当......
  • 2024/2/22
    我们的一条数据项目包括,收入(指出)、说明、日期、金额四项,所以我们要自定义一个适配器这里适配器的一个列表的各个单位的类型是一个打包好的类的类型。这个类也是自己创建的packagecom.example.myapplication;publicclasscostList{privateString_id;private......
  • 2024/2/21
    今天根据黑马的视频来完成一些小练习用js来:1.切换图片2.在文本后添加文字3.使所有的复选框被选中<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><title>JSP-HelloWorld</title></......
  • 2024年性价比高的服务器多少钱?腾讯云最新更新
    在当今这个数据驱动的时代,选择一款合适的服务器对于企业和个人开发者来说至关重要。腾讯云,作为国内领先的云服务提供商,为广大用户提供了多样化的服务器选择。那么,在腾讯云的众多服务器产品中,我们该如何做出明智的选择呢?首先,对于轻量级应用或初创项目,轻量应用服务器无疑是一个经......
  • 题解 P10196【[USACO24FEB] Lazy Cow P】
    总算铂金组场切一题。似乎做麻烦了,而且常数蛮大的,但是没啥思维难度,记录一下。对于每一个需求,我们将其放置在平面直角坐标系的\((m_i,b_i)\)位置。另外,自然有一个\((0,0)\)需求,也同样处理这个点。我们需要支持插入一个点的操作,并维护出答案。先考虑不需要动态插点,只在最后求......
  • 第十四届蓝桥杯个人题解
    a幸运的数主要是思路 遍历1-100000000每一层循环,首先将其每一位分到数组里,并记录位数,如果是偶数位再接着往下,比较前半和后半是否相等:通过加减最后结果是否为零来判断intmain(){  intnum=0;  for(inti=1;i<100000000;i++)  {    ints[9]={0};......