信奥赛-刷题笔记-栈篇-T2-P3056括号调整问题0518

news2025/7/19 7:08:07

总题单

本部分总题单如下

【腾讯文档】副本-CSP-JS+NOI 题单 (未完待续)

https://docs.qq.com/sheet/DSmJuVXR4RUNVWWhW?tab=BB08J2

栈篇题单

在这里插入图片描述

P3056 [USACO12NOV] Clumsy Cows S

https://www.luogu.com.cn/problem/P3056

题目描述

Bessie the cow is trying to type a balanced string of parentheses into her new laptop, but she is sufficiently clumsy (due to her large hooves) that she keeps mis-typing characters. Please help her by computing the minimum number of characters in the string that one must reverse (e.g., changing a left parenthesis to a right parenthesis, or vice versa) so that the string would become balanced.
奶牛 Bessie 正在尝试在她的新笔记本电脑上输入一个平衡的括号字符串,但是由于她蹄子太大,打字时总是会按错字符。请你帮帮她:计算最少需要修改多少个括号字符(即把左括号 ( 改为右括号 ),或者反过来),才能使这个括号字符串变成平衡的括号串。
There are several ways to define what it means for a string of parentheses to be “balanced”. Perhaps the simplest definition is that there must be the same total number of ('s and )'s, and for any prefix of the string, there must be at least as many ('s as )'s. For example, the following strings are all balanced:
对于“平衡的括号字符串”,我们可以有几种定义方式。也许最简单的定义是这样的:

整个字符串中,左括号 ( 和右括号 ) 的数量必须相等;

对于任意一个前缀子串来说,左括号 ( 的数量必须不少于右括号 ) 的数量。

例如,下面这些字符串都是平衡的:
()
(())
()(()())

while these are not:
而下面这些则不是:

)(
())(
((())))

给出一个偶数长度的括号序列,问最少修改多少个括号可以使其平衡。

输入格式

* Line 1: A string of parentheses of even length at most 100,000 characters.
第一行:一个仅由括号组成的字符串,长度不超过 100,000,且长度一定是偶数。

输出格式

* Line 1: A single integer giving the minimum number of parentheses that must be toggled to convert the string into a balanced string.
第一行:一个整数,表示最少需要修改的括号数量。

输入输出样例 #1

输入 #1

())(

输出 #1

2

说明/提示

The last parenthesis must be toggled, and so must one of the two middle right parentheses.
解释:可以将第一个 ) 改成 (,最后一个 ( 改成 ),得到 (()()),这是一个平衡的括号串。

思路

让我们通过一个更详细的例子来解释这个问题和解决方案。

示例输入与输出

输入
())(
输出
2

详细解释

输入字符串分析

我们有一个括号序列 ())(。为了使这个括号序列平衡,我们需要确保以下两点:

  1. 整个字符串中左括号 ( 和右括号 ) 的数量相等。
  2. 对于任意前缀子串,左括号的数量不少于右括号的数量。

对于给定的字符串 ())(

  • 总共有 2 个左括号 ( 和 2 个右括号 ),所以条件 1 已经满足。
  • 但是,如果我们从左到右扫描字符串,我们会发现第一个字符是右括号 ),这违反了条件 2(即在任何时刻左括号的数量不能少于右括号的数量)。

因此,我们需要调整一些括号来使得整个字符串变成平衡的。

解决方案步骤
  1. 初始化计数器:我们需要两个计数器,left 表示未匹配的左括号数量,right 表示未匹配的右括号数量。
  2. 遍历字符串:从左到右遍历字符串中的每个字符,并根据当前字符更新计数器。
    • 如果遇到左括号 (,增加 left 计数器。
    • 如果遇到右括号 ),首先检查是否有未匹配的左括号(即 left > 0),如果有,则减少 left 计数器;如果没有,则增加 right 计数器。
  3. 计算最小修改次数:最终需要修改的括号数量就是 left + right
步骤分解
  1. 初始化 left = 0, right = 0
  2. 遍历字符串 ())(
    • 第一个字符 ):没有未匹配的左括号 (left = 0),所以增加 right,现在 right = 1
    • 第二个字符 ):仍然没有未匹配的左括号 (left = 0),所以再次增加 right,现在 right = 2
    • 第三个字符 (:增加 left,现在 left = 1
    • 第四个字符 (:增加 left,现在 left = 2

最终,我们有 left = 2right = 2,这意味着我们需要将其中的两个右括号 ) 改为左括号 (,或者反过来。具体来说,我们可以将最后一个 ( 改为 ),并且将第一个 ) 改为 (,从而得到 (()()),这是一个平衡的括号串。

最小修改次数

因此,最少需要修改 2 个括号,使得原字符串变为平衡的括号串。

完整过程总结

  1. 初始状态:left = 0, right = 0
  2. 处理第一个字符 )right = 1
  3. 处理第二个字符 )right = 2
  4. 处理第三个字符 (left = 1
  5. 处理第四个字符 (left = 2
  6. 结果:left + right = 2 + 2 = 4,但由于我们可以相互抵消,实际需要修改的次数是 max(left, right) = 2

这就是为什么对于输入 ())(,输出结果是 2

代码1

#include <iostream>
#include <stack>
#include <cstring>

using namespace std;

int main() {
    char str[100010];
    cin >> str;
    int len = strlen(str);
    int ans = 0;

    stack<char> st;

    for (int i = 0; i < len; ++i) {
        if (str[i] == '(') {
            st.push('('); // 左括号入栈
        } else {
            if (st.empty()) {
                // 没有左括号可以匹配,必须修改这个右括号
                ans++;
                st.push('('); // 假设把这个右括号改成左括号继续匹配
            } else {
                st.pop(); // 匹配成功
            }
        }
    }

    // 剩下的都是未匹配的左括号,每两个中改一个
    int left = st.size();
    ans += left / 2;

    cout << ans << endl;
    return 0;
}
/*

())( 

*/ 

代码2

#include<cstdio>
#include<cstring>//便于使用strlen();
using namespace std;
const int maxn=100010;
char str[maxn];//我也不知道用const开数组的习惯从何而来,先这样吧
int ans,ls,num;//ans即answer,ls即str字符串的长度,num就是个假栈顶,说明现在已经有num个括号未匹配成功
int main(){
	scanf("%s",&str);
	ls=strlen(str);//记录str的长度,不要问我为什么不用STL
	for(int i=0;i<ls;i++){
		if(str[i]=='(')  num++;//等待匹配右括号
		else if(str[i]==')'&&num==0){//num==0即为现在str[i]之前所有括号都能匹配,凭空出现个右括号,ans自加,并将该括号转为左括号等待匹配
			ans++;num++;
		}else num--;//匹配成功后要减少一个待匹配的数量
	}
	ans+=num/2;//还有num个左括号没有匹配,便将其中的一半转为右括号
	if(num%2!=0)  ans++;//如果num是单数,则有一个括号必须进行一次删除修改
    //值得一提的是,楼上的dalao用的ans+=(num+1)/2;和此思路一致,也更加巧妙,我太弱所以没想到
	printf("%d",ans);
	return 0;
}

/*

())( 

*/ 

代码2

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cin >> s;

    int balance = 0, ans = 0;

    for (char c : s) {
        // 如果为( 则balance++
        if (c == '(') 
            balance++;
        else { // 说明是)
            // 如果balance为0 说明没有 ( 那么出现)是有问题的
            if (balance == 0) {
                ans++;         // 多了一个右括号,强制改成左括号
                balance = 1;     // 添加一个虚拟的左括号用于后续匹配
            } else {
                balance--; // )和( 匹配 balance--
            }
        }
    }

    ans += balance / 2; //最终还剩余的左括号( 需要把一半换为 右括号) 添加到答案中

    cout << ans << endl;

    return 0;
}

现场真题注意事项

https://cspoj.com/contest.php?cid=1002Fus5yz4x3EcSJH1Z

注意事项

文件名(程序名和输入输出文件名)必须使用英文小写。(提交必须使用freopen()进行提交)

C/C++ 中函数 main() 的返回值类型必须是 int,程序正常结束时的返回值必须是0。

提交的程序代码文件的放置位置请参考各省的具体要求。

因违反以上三点而出现的错误或问题,申述时一律不予受理。

若无特殊说明,结果的比较方式为全文比较(过滤行末空格及文末回车)。

程序可使用的栈空间内存限制与题目的内存限制一致。

全国统一评测时采用的机器配置为:Inter® Core™ i7-8700K CPU @3.70GHz,内存 32GB。上述时限以此配置为准。

只提供 Linux 格式附加样例文件。

评测在当前最新公布的 NOI Linux 下进行,各语言的编译器版本以此为准

假设输入样例数据存在文件test.in中,输出样例数据存在文件test.out中,

则在CSP、NOI等比赛的代码中,需添加freopen、fclose语句,

内容详见模板代码如下。

#include <bits/stdc++.h>
#include<cstdio>//必须包含cstdio头文件
#include<iostream>
using namespace std;
 
int main(){
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	
	cout<<"Hello NOI"<<endl;
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}

复制

下面为函数的简介,详细可参见 http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html

函数名:freopen

声明:FILE freopen( const char path, const char mode, FILE stream );

所在文件: stdio.h

参数说明:

path: 文件名,用于存储输入输出的自定义文件名。

mode: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。

stream: 一个文件,通常使用标准流文件。

返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。(一般可以不使用它的返回值)

功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    freopen("7532.in", "r", stdin);
    freopen("7532.out", "w", stdout);
    //原来的代码保持不变
    double a, b, r;
    int k;
    cin >> a >> b;
    k = int(a/b);
    r = a - b * k;
    printf("%g", r);
    //-------------
    fclose(stdin);
    fclose(stdout);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

inverse-design-of-grating-coupler-3d

一、设计和优化3D光栅耦合器 1.1 代码讲解 通过预定义的环形间距参数(distances数组),在FDTD中生成椭圆光栅结构,并通过用户交互确认几何正确性后,可进一步执行参数扫描优化。 # os:用于操作系统相关功能(如文件路径操作) import os import sys# lumapi:Lumerical 的…

Science Robotics 封面论文:基于形态学开放式参数化的仿人灵巧手设计用于具身操作

人形机械手具有无与伦比的多功能性和精细运动技能&#xff0c;使其能够精确、有力和稳健地执行各种任务。在古生物学记录和动物王国中&#xff0c;我们看到了各种各样的替代手和驱动设计。了解形态学设计空间和由此产生的涌现行为不仅可以帮助我们理解灵巧的作用及其演变&#…

DSU-Net

目录 Abstract 摘要 DSU-Net 模型框架 编码器 轻量级适配器模块 特征融合与协作 解码器 模型优势 实验 代码 总结 Abstract DSU-Net is an improved U-Net model based on DINOv2 and SAM2. It addresses the limitations of existing image segmentation models …

2025年- H30-Lc138- 141.环形链表(快慢指针,快2慢1)---java版

1.题目描述 2.思路 弗洛伊德算法&#xff08;快慢指针 3.代码实现 public boolean hasCycle(ListNode head) {//1.如果空节点或者只有一个节点&#xff0c;都说明没有环&#xff0c;返回falseif(headnull||head.nextnull){return false;}//2.定义快慢指针&#xff0c;都从头…

LoadBarWorks:一款赛博风加载动画生成器的构建旅程

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 项目缘起&#xff1a;赛博与实用的结合 在日常开发中&#xff0c;我经常需要为不同的项目添加加载动画&#x…

SAP集团内部公司间交易自动开票

SAP集团内部公司间交易自动开票(非STO/EDI模式) 集团内部公司间采购与销售业务&#xff0c;在确认相应单据无误后&#xff0c;为减少人工开票业务&#xff0c; 可以用系统标准功能来实现自动开票。 1.采购发票自动开票(ERS) T-CODE:BP,勾选“基于收货的发票校验”、“自动G…

【YOLO(txt)格式转VOC(xml)格式数据集】以及【制作VOC格式数据集 】

1.txt—>xml转化代码 如果我们手里只有YOLO标签的数据集&#xff0c;我们要进行VOC格式数据集的制作首先要进行标签的转化&#xff0c;以下是标签转化的脚本。 其中picPath为图片所在文件夹路径&#xff1b; txtPath为你的YOLO标签对应的txt文件所在路径&#xff1b; xmlPa…

Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器

目录 1. 回显服务器 -- echo server 1.1 相关函数介绍 1.1.1 socket() 1.1.2 bind() 1.1.3 recvfrom() 1.1.4 sendto() 1.1.5 inet_ntoa() 1.1.6 inet_addr() 1.2 Udp 服务端的封装 -- UdpServer.hpp 1.3 服务端代码 -- UdpServer.cc 1.4 客户端代码 -- UdpClient.…

C++笔试题(金山科技新未来训练营):

题目分布&#xff1a; 17道单选&#xff08;每题3分&#xff09;3道多选题&#xff08;全对3分&#xff0c;部分对1分&#xff09;2道编程题&#xff08;每一道20分&#xff09;。 不过题目太多&#xff0c;就记得一部分了&#xff1a; 单选题&#xff1a; static变量的初始…

【RabbitMQ】 RabbitMQ高级特性(二)

文章目录 一、重试机制1.1、重试配置1.2、配置交换机&队列1.3、发送消息1.4、消费消息1.5、运行程序1.6、 手动确认 二、TTL2.1、设置消息的TTL2.2、设置队列的TTL2.3、两者区别 三 、死信队列6.1 死信的概念3.2 代码示例3.2.1、声明队列和交换机3.2.2、正常队列绑定死信交…

电子电路:什么是电流离散性特征?

关于电荷的量子化,即电荷的最小单位是电子的电荷量e。在宏观电路中,由于电子数量极大,电流看起来是连续的。但在微观层面,比如纳米器件或单电子晶体管中,单个电子的移动就会引起可观测的离散电流。 还要提到散粒噪声,这是电流离散性的表现之一。当电流非常小时,例如在二…

深入理解位图(Bit - set):概念、实现与应用

目录 引言 一、位图概念 &#xff08;一&#xff09;基本原理 &#xff08;二&#xff09;适用场景 二、位图的实现&#xff08;C 代码示例&#xff09; 三、位图应用 1. 快速查找某个数据是否在一个集合中 2. 排序 去重 3. 求两个集合的交集、并集等 4. 操作系…

猫番阅读APP:丰富资源,优质体验,满足你的阅读需求

猫番阅读APP是一款专为书籍爱好者设计的移动阅读应用&#xff0c;致力于提供丰富的阅读体验和多样化的书籍资源。它不仅涵盖了小说、非虚构、杂志等多个领域的电子书&#xff0c;还提供了个性化推荐、书架管理、离线下载等功能&#xff0c;满足不同读者的阅读需求。无论是通勤路…

MetaMask安装及使用-使用水龙头获取测试币的坑?

常见的异常有&#xff1a; 1.unable to request drip, please try again later. 2.You must hold at least 1 LINK on Ethereum Mainnet to request native tokens. 3.The address provided does not have sufficient historical activity or balance on the Ethereum Mainne…

AI:OpenAI论坛分享—《AI重塑未来:技术、经济与战略》

AI&#xff1a;OpenAI论坛分享—《AI重塑未来&#xff1a;技术、经济与战略》 导读&#xff1a;2025年4月24日&#xff0c;OpenAI论坛全面探讨了 AI 的发展趋势、技术范式、地缘政治影响以及对经济和社会的广泛影响。强调了 AI 的通用性、可扩展性和高级推理能力&#xff0c;以…

Linux配置vimplus

配置vimplus CentOS的配置方案很简单&#xff0c;但是Ubuntu的解决方案网上也很多但是有效的很少&#xff0c;尤其是22和24的解决方案&#xff0c;在此我整理了一下我遇到的问题解决方法 CentOS7 一键配置VimForCPP 基本上不会有什么特别难解决的报错 sudo yum install vims…

服务端HttpServletRequest、HttpServletResponse、HttpSession

一、概述 在JavaWeb 开发中&#xff0c;获取客户端传递的参数至关重要。http请求是客户端向服务端发起数据传输协议&#xff0c;主要包含包含请求行、请求头、空行和请求体四个部分&#xff0c;在这四部分中分别携带客户端传递到服务端的数据。常见的http请求方式有get、post、…

实验九视图索引

设计性实验 1. 创建视图V_A包括学号&#xff0c;姓名&#xff0c;性别&#xff0c;课程号&#xff0c;课程名、成绩&#xff1b; 一个语句把学号103 课程号3-105 的姓名改为陆君茹1&#xff0c;性别为女 &#xff0c;然后查看学生表的信息变化&#xff0c;再把上述数据改为原…

git 本地提交后修改注释

dos命令行进入目录&#xff0c;idea可以点击Terminal 进入命令行 git commit --amend -m "修改内容"

面向具身智能的视觉-语言-动作模型(VLA)综述

具身智能被广泛认为是通用人工智能&#xff08;AGI&#xff09;的关键要素&#xff0c;因为它涉及控制具身智能体在物理世界中执行任务。在大语言模型和视觉语言模型成功的基础上&#xff0c;一种新的多模态模型——视觉语言动作模型&#xff08;VLA&#xff09;已经出现&#…