新手快亲它啊
2026-05-30 21:26:12
发布于:北京
6阅读
0回复
0点赞
这道题可以说是很水很好的一道题,本题的难点在于输出变成合法括号序列的最少操作次数其实就是不合法的括号个数除以2,因为我们只用修改其中的一半,就会变成合法括号序列。
例如下列
)))((((())
不合法括号个数为6,位置为前六个,我们只用修改前三个,就可以变成合法括号序列。
思路如上,其次就是代码先建立队列,以及存储答案的变量
int n;
string s;
cin >> n >> s ;
queue<int> q;
int ans = 0 ;
其次遍历,若为(则存到队列里,否则判断队列里是否还有东西,若有,删除它,否则答案加一,最后判断队列是否为空,若是,跳过,否则答案加队列里的元素个数除以二最后输出》
for(int i = 0 ; i < s.size() ; i++) {
if(s[i] == '(') {
q.push('(');
}
else {
if(!q.empty()) {
q.pop();
}
else {
ans++;
}
}
}
if(!q.empty()) ans += q.size();
cout << ans / 2 << endl;
最后加上T组测试样例,完整版:
#include <bits/stdc++.h>
using namespace std ;
int n;
string s;
void solve() {
cin >> n >> s ;
queue<int> q;
int ans = 0 ;
for(int i = 0 ; i < s.size() ; i++) {
if(s[i] == '(') {
q.push('(');
}
else {
if(!q.empty()) {
q.pop();
}
else {
ans++;
}
}
}
if(!q.empty()) ans += q.size();
cout << ans / 2 << endl;
}
int main () {
int T ;
cin >> T ;
while(T--) {
solve();
}
return 0 ;
}
这里空空如也




有帮助,赞一个