题解 CodeForces 430B Balls Game 栈 C/C++

题目传送门:

Problem - B - Codeforcesicon-default.png?t=O83Ahttps://mirror.codeforces.com/contest/430/problem/B翻译:

Iahub正在为国际信息学奥林匹克竞赛(IOI)做准备。有什么比玩一个类似祖玛的游戏更好的训练方法呢?

一排中有n个球。每个球都染着k种颜色中的一种。最初,这一排球中不会有三个或三个以上连续相同颜色的球。Iahub有一个颜色为x的球。他可以将他的球插入排列中的任意位置(可能是在另外两个球之间)。如果任何时刻排列中有三个或三个以上连续相同颜色的球,它们将立即被销毁。这个规则会被多次应用,直到没有更多连续三个或三个以上相同颜色的球。

例如,如果Iahub有一排球[黑, 黑, 白, 白, 黑, 黑]和一个白球,他可以将球插入两个白球之间。这样三个白球被销毁,然后四个黑球变得连续,所以所有四个球都被销毁。最终排列中将不再有任何球,因此Iahub可以销毁所有6个球。

Iahub希望尽可能多地销毁球。给定球排列的描述以及Iahub的球的颜色,通过告诉他他可以销毁的最大数量的球来帮助Iahub为IOI做准备。

输入

输入的第一行包含三个整数:n(1 ≤ n ≤ 100)、k(1 ≤ k ≤ 100)和x(1 ≤ x ≤ k)。接下来一行包含n个空格分隔的整数c1, c2, ..., cn(1 ≤ ci ≤ k)。数字ci表示排列中第i个球的颜色为ci

保证初始球排列永远不会包含三个或三个以上连续相同颜色的球。

输出

输出一个整数 — Iahub可以销毁的最大数量的球。

示例

InputOutput
6 2 2
1 1 2 2 1 1
6
InputOutput
1 1 1
1

思路:

祖玛游戏/一维消消乐,找到一个消除点,并向两端扩展

可以在脑中想象一下这个过程,这和括号序列匹配很像 

事件之间都是完全包含关系,不难想到,可以用栈解决

此外,将相连的相同颜色的球视为一个整体 (一个括号)

会使我们处理起来方便得多,因此我们先对输入的内容做一个预处理,将颜色相同的球合并

结构体 A 的一个对象就是相连的相同颜色的球的一个整体

color 表示整体的颜色,num 表示整体包含的球的数量

将预处理结果存入 arr,然后遍历 arr,寻找可以消除的位置,之后进行 "括号序列匹配"

细节见代码

代码:

#include <algorithm>
#include <iostream>
using namespace std;
struct A { int color, num; } arr[105], stk[105];//stk 是一个临时的栈,每次循环开始都会清空
int n, k, x, pre, input, top = -1, ans;//pre 在预处理时记录上一次的输入,pre 与输入 input 相同时,合并相同颜色,否则新建一个整体。pre 初始值要和所有颜色都不相同
int main()
{
	cin >> n >> k >> x;
	for (int i = 0; i < n; i++)//预处理
	{
		cin >> input;
		if (input != pre) arr[++top] = { input, 1 };//不同颜色新建一个整体
		else arr[top].num++;//合并相同颜色
		pre = input;
	}
	for (int i = 0; i <= top; i++)//遍历,寻找能够消除的位置。枚举所有情况
	{
		if (arr[i].color == x && arr[i].num >= 2)//整体颜色与 x 相同,且整体元素数量 >= 2 时,可以消除
		{
			arr[i].num++;//将 x 合并到整体里,然后创建一个临时的栈 stk,从头开始做 "括号序列匹配"
			//只不过匹配成功进行消除的条件是:整体元素数量 >= 3,或,即将入栈的整体与栈顶整体颜色相同,且总元素数量 >= 3
			int t = -1, cnt = 0;//t 指向栈顶元素,每轮枚举都从栈为空开始。cnt 统计该轮消除的球的数量
			for (int j = 0; j <= top; j++)//"括号序列匹配"
			{
				if (arr[j].num >= 3) cnt += arr[j].num;
				else if (t == -1 || arr[j].color != stk[t].color) stk[++t] = arr[j];
				else
				{
					stk[t].num += arr[j].num;
					if (stk[t].num >= 3) cnt += stk[t--].num;
				}
			}
			arr[i].num--;//恢复现场,参考 DFS 中回溯后要进行的操作,这样不影响下一轮枚举
			ans = max(ans, cnt - 1);//答案不包含 x 本身,所以 ans 更新时和 cnt-1 比较
		}
	}
	cout << ans;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955808.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、线程概念 &#x1f4d6; 回顾进程 &#x1f4d6; 引入线程 &#x1f4d6; 总结 &a…

PDF文件提取开源工具调研总结

概述 PDF是一种日常工作中广泛使用的跨平台文档格式&#xff0c;常常包含丰富的内容&#xff1a;包括文本、图表、表格、公式、图像。在现代信息处理工作流中发挥了重要的作用&#xff0c;尤其是RAG项目中&#xff0c;通过将非结构化数据转化为结构化和可访问的信息&#xff0…

简历_使用优化的Redis自增ID策略生成分布式环境下全局唯一ID,用于用户上传数据的命名以及多种ID的生成

系列博客目录 文章目录 系列博客目录WhyRedis自增ID策略 Why 我们需要设置全局唯一ID。原因&#xff1a;当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题。 问题&#xff1a;id的规律性太明显、…

跨境电商使用云手机用来做什么呢?

随着跨境电商的发展&#xff0c;越来越多的卖家开始尝试使用云手机来协助他们的业务&#xff0c;这是因为云手机具有许多优势。那么&#xff0c;具体来说&#xff0c;跨境电商使用云手机可以做哪些事情呢&#xff1f; &#xff08;一&#xff09;实现多账号登录和管理 跨境电商…

计算机网络 (47)应用进程跨越网络的通信

前言 计算机网络应用进程跨越网络的通信是一个复杂而关键的过程&#xff0c;它涉及多个层面和组件的协同工作。 一、通信概述 计算机网络中的通信&#xff0c;本质上是不同主机中的应用进程之间的数据交换。为了实现这种通信&#xff0c;需要借助网络协议栈中的各层协议&#x…

Open3D 计算每个点的协方差矩阵【2025最新版】

目录 一、算法原理1、计算公式2、主要函数3、函数源码二、代码实现三、结果展示博客长期更新,本文最近更新时间为:2025年1月18日。 一、算法原理 1、计算公式 对于点云数据中的任意一点 p p p,根据其邻域内点的坐标计算其协方差矩阵。计算公式如下:

e2studio开发RA0E1(16)----配置RTC时钟及显示时间

e2studio开发RA0E1.16--配置RTC时钟及显示时间 概述视频教学样品申请完整代码下载硬件准备参考程序新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_UARTA_Open()函数原型回调函数user_uart_callba…

Go语言strings包与字符串操作:从基础到高级的全面解析

Go语言strings包与字符串操作:从基础到高级的全面解析 引言 Go语言以其简洁、高效和强大的标准库而闻名,其中strings包是处理字符串操作的核心工具。本文将深入探讨Go语言中strings包的功能及其在实际开发中的应用,帮助开发者更好地理解和使用这一工具。 1. strings包概述…

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码&#xff0c;导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址&#xff1a;icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …

加密货币的基本交易技术指标

是币安交易市场的基本版视图,trading View是有更复杂的参数追踪。币安的交易的技术指标有主图和副图。有很多指标&#xff0c;让ai解释一下相关概念和意义。加密货币交易中可能遇到的主图指标及其含义&#xff1a; 1. MA&#xff08;移动平均线&#xff0c;Moving Average&…

简单介绍JSONStream的使用

地址 作用 这个模块是根据需要筛选出json数据中自己所需要的数据 使用 var JSONStream require("JSONStream"); var parse require("fast-json-parse"); var fs require("fs");fs.createReadStream("./time.json").pipe(JSONSt…

UOS扩容攻略:迁移home

原文链接&#xff1a;UOS扩容攻略&#xff1a;迁移/home Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于 UOS 扩容攻略&#xff1a;迁移 /home 目录 的文章。相信很多朋友在使用 UOS 系统时&#xff0c;会遇到系统分区空间不足&#xff0c;尤其是 /home 目录存…

RK3588平台开发系列讲解(NPU篇)NPU 驱动的组成

文章目录 一、NPU 驱动组成二、查询 NPU 驱动版本三、查询 rknn_server 版本四、查询 librknn_runtime 版本沉淀、分享、成长,让自己和他人都能有所收获!😄 一、NPU 驱动组成 NPU 驱动版本、rknn_server 版本、librknn_runtime 版本以及 RKNN Toolkit 版本的对应关系尤为重…

【实践】操作系统智能助手OS Copilot新功能测评

一、引言 数字化加速发展&#xff0c;尤其人工智能的发展速度越来越快。操作系统智能助手成为提升用户体验与操作效率的关键因素。OS Copilot借助语言模型&#xff0c;人工智能等&#xff0c;对操作系统的自然语言交互操作 推出很多功能&#xff0c;值得开发&#xff0c;尤其运…

C# OpenCvSharp 部署3D人脸重建3DDFA-V3

目录 说明 效果 模型信息 landmark.onnx net_recon.onnx net_recon_mbnet.onnx retinaface_resnet50.onnx 项目 代码 下载 参考 C# OpenCvSharp 部署3D人脸重建3DDFA-V3 说明 地址&#xff1a;https://github.com/wang-zidu/3DDFA-V3 3DDFA_V3 uses the geometri…

Linux-day08

第17章 大数据定制篇-shell编程 shell编程快速入门 shell变量 设置环境变量 把行号打开 set nu 位置参数变量 预定义变量 在一个脚本中执行了另外一个脚本所以卡住了 CTRLC退出 运算符 operator运算符 条件判断 流程控制 单分支多分支 case语句 for循环 反复的把取出来的i值…

海康工业相机的应用部署不是简简单单!?

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 笔者使用的设备及环境&#xff1a;WSL2-Ubuntu22.04MV-CS016-10UC 不会吧&#xff1f;不会吧&#xff1f;不会还有人拿到海康工业相机还是一脸懵叭&#xff1f;不会还有人…

ComfyUI-PromptOptimizer:文生图提示优化节点

ComfyUI-PromptOptimizer 是 ComfyUI 的一个自定义节点&#xff0c;旨在优化文本转图像模型的提示。它将用户输入的提示转换为更详细、更多样化、更生动的描述&#xff0c;使其更适合生成高质量的图像。无需本地模型。 1、功能 提示优化&#xff1a;优化用户输入的提示以生成…

力扣 完全平方数

动态规划&#xff0c;找到前几个状态做更新。 题目 从题可看出又是一道dp&#xff0c;只要找到一个最大的平方数&#xff0c;然后往回退到上个状态&#xff0c;然后再用回退的状态加回去这个平方数即加上这一种。注意这里的所含平方数并不是随着数字变大而变大的&#xff0c;因…

使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程

使用 Java 开发 Android 应用&#xff1a;Kotlin 与 Java 的混合编程 在开发 Android 应用程序时&#xff0c;我们通常可以选择使用 Java 或 Kotlin 作为主要的编程语言。然而&#xff0c;有些开发者可能会想要在同一个项目中同时使用这两种语言&#xff0c;这就是所谓的混合编…