ACWING/2004. 错字

2023-10-30 17:40
文章标签 acwing 2004 错字

本文主要是介绍ACWING/2004. 错字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
在这里插入图片描述

题解

题目重点:

  • 条件1:对于字符串的任意前缀,所包含的 ( 的数目都不少于 ) 的数目。

  • 条件2:输入的字符串满足:最多只修改一个字符,即可变为平衡括号字符串。

因此本题限制在了只需要变化一个括号就一定能序列匹配!

结题思路:

  • 分类:1.左右括号数R L相同;2.右括号需要转化为左括号:R=L+2;左括号需要转化为有括号:L=R+2

  • 类型①:输出0直接

  • 类型②:记录每个位置的从左到右 左右括号分别的前缀和,由条件1可得:从左向右搜索第一个左括号比右括号少的右括号位置, 则位置及其之前的任意一个右括号改变为左括号才能满足条件1,答案为此位置的右括号前缀和

  • 类型③:记录每个位置的从右到左 左右括号分别的前缀和,由条件1可得:从右向左搜索第一个右括号比左括号少的左括号位置,则该位置及其右侧任意一个左括号改变为右括号就可以满足条件1,答案为此位置的左括号前缀和

#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;int main(){string arr;cin>>arr;int n = arr.length();int L = 0,R = 0;for(int i = 0;i<n;i++){if(arr[i] == '(') L++;else R++;}int sumL[n+1] = {0}; // 前缀和int sumR[n+1] = {0};if(L == R){cout<<0<<endl;}else if(L < R){// 右括号需要转化为左括号:R=L+2for(int i = 0;i<n;i++){sumL[i+1] = sumL[i];sumR[i+1] = sumR[i];if(arr[i] == '(') sumL[i+1] = sumL[i+1] + 1;else sumR[i+1] = sumR[i+1] + 1;// 判断 第一个左括号比右括号少的右括号位置if(arr[i] == ')' and sumL[i+1] < sumR[i+1]){cout<<sumR[i+1]<<endl;break;}}}else{// 左括号需要转化为有括号:L=R+2for(int i = n-1;i>=0;i--){sumL[i] = sumL[i+1];sumR[i] = sumR[i+1];if(arr[i] == '(') sumL[i] = sumL[i] + 1;else sumR[i] = sumR[i] + 1;// 判断 第一个右括号比左括号少的左括号位置if(arr[i] == '(' and sumL[i] > sumR[i]){cout<<sumL[i]<<endl;break;}}}return 0;
}

这篇关于ACWING/2004. 错字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/309555

相关文章

Regionals 2004 Asia - Beijing Argus 小根堆

点击打开链接 小根堆 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokeni

【AcWing】851. 求最短路

spfa算法其实是对贝尔曼福特算法做一个优化。 贝尔曼福特算法会遍历所有边来更新,但是每一次迭代的话我不一定每条边都会更新,SPFA是对这个做优化。 如果说dist[b]在当前这次迭代想变小的话,那么一定是dist[a]变小了,只有a变小了,a的后继(b)才会变小。 用宽搜来做优化,用一个队列,队列里边存的就是所有变小了的结点(队列里存的是待更新的点)。 基本思路就是我更新过谁,我再拿

【AcWing】852. spfa判断负环

#include<iostream>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int N= 1e5+10;int n,m;int h[N],w[N],e[N],ne[N],idx;int dist[N],cnt[N];//cnt存最短路径的边数bool st[N];v

AcWing 282. 石子合并

必看的视频讲解↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 【E28【模板】区间DP 石子合并——信息学竞赛算法】 合并过程总开销等于红色数字总和,可以理解为花费的总体力! f数组的含义是f【i】【j】是从第i堆石子开始到第j堆石子的花费体力最小值 如何理解三层for呢? 第一层for是控制区间长度len,第二层for是控制区间起点位置i,第三层for是控制区间

AcWing 897. 最长公共子序列

动态规划就是多见识应用题就完事儿了,也没有什么好说的。 讲解参考: 【E05 线性DP 最长公共子序列】 #include<iostream>#include<algorithm>#define N 1010using namespace std;char a[N],b[N];int n,m;int f[N][N];int main(){cin >> n >> m >> a

AcWing 2. 01背包问题

一定要看的视频讲解:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 【E08【模板】背包DP 01背包——信息学竞赛算法】 i表示放入i个物品,j表示第j个物品,用于访问体积v【j】 #include <iostream>#include <algorithm>using namespace std;const int N = 1010;int n, m;int v[N]

文章中的错字一并替换成正确的字

with open("文件路径","模式","编码")  as file   ("r" 是读,"w"是写) with open(r"D:\python-installer\python-code\pythonProject\src\关于文件操作练习/人物介绍.txt","r",encoding="utf-8") as file1:data=file1.read()print(type(d

AcWing-算法提高课(第一章)-下

区间DP 环形石子合并 状态表示:f[i,j](f[i,j]表示,在,由,将第i堆石子到第j堆石子合并成一堆石子的每个合并方式的代价,组成的集合,中,的最小值)状态计算:f[i,j]=min(f[i,k]+f[k+1,j]+s[j]-s[i-1])(s[j]表示第1堆石子到第j堆石子的总重量,s[i-1]表示第1堆石子到第i-1堆石子的总重量,s[j]-s[i-1]表示第i堆石子到第j堆石子的

2024“华为杯”第二十一届中国研究生数学建模竞赛2004-2023华为杯数学建模优秀论文(见文末)

2024“华为杯”第二十一届中国研究生数学建模竞赛&2004-2023华为杯数学建模优秀论文(见文末) 各研究生培养单位: 中国研究生数学建模竞赛(以下简称“竞赛”)是教育部学位管理与研究生教育司指导,中国学位与研究生教育学会、中国科协青少年科技中心主办的“中国研究生创新实践系列大赛”主题赛事之一,是一项面向在校研究生进行数学建模应用研究与实践的学术竞赛活动,是广大在校研究生提高建立数学模

贪心推公式——AcWing 125. 耍杂技的牛

贪心推公式 定义 贪心算法是一种在每一步选择中都采取在当前状态下最优的选择,希望通过局部的最优选择来得到全局最优解的算法策略。 运用情况 问题具有最优子结构,即一个问题的最优解包含其子问题的最优解。可以通过局部最优决策逐步推导到全局最优。问题的选择策略相对明确且易于计算。 注意事项 贪心算法并不总是能得到全局最优解,可能会陷入局部最优。对于一些复杂问题,需要谨慎验证其正确性。可能需要对