括号序列的条件
一个序列是括号序列的条件是:在所有位置,前面(含当前位置)的左括号的数量大于等于右括号的数量,且最终相等。
例题:
https://codeforces.com/contest/1709/problem/C

#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef pair<long long, long long> PLL; void YD() { string str; cin >> str; int l = 0, r = 0, q = 0; for (auto ch : str) { if (ch == '(') l++; else if (ch == ')') r++; else q++; } int x = r + q - l; x >>= 1; if (x < 0) { cout << "YES" << endl; return; } int n = str.size(); vector<int> mark(n); for (int i = 0; i < n; i++) { if (str[i] == '?') { if (x) mark[i] = 1, x--; else mark[i] = 2; } } int ll = -1, rr = -1; for (int i = 0; i < n; i++) { if (mark[i] == 2) { rr = i; break; } } for (int i = n-1; i >=0; i--) { if (mark[i] == 1) { ll = i; break; } } if (ll == -1 || rr == -1) { cout << "YES" << endl; return; } mark[ll] = 2; mark[rr] = 1; for (int i = 0; i < n; i++) { if (mark[i] == 1) str[i] = '('; if (mark[i] == 2) str[i] = ')'; } ll = 0, rr = 0; for (int i = 0; i < n; i++) { if (str[i] == '(') ll++; else rr++; if (rr > ll) { cout << "YES" << endl; return; } } cout << "NO" << endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int T = 1; cin >> T; while (T--) { YD(); } return 0; }
此题的思路为,先构造一个最优的结果(尽可能将左边的"?"改为"(")。
然后尝试将最右边的"("与最左边的")"交换,(这样对中间的计数影响最小)
如果是合法的,说明存在其他修改的方案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人