[SMOJ2088]魔法练习
来源:互联网 发布:网络维护是什么职位 编辑:程序博客网 时间:2024/05/18 00:24
40%:
暴力枚举每一个 ? 是变成左括号还是右括号,再检查合法性,取费用最小的合法方案。
时间复杂度:
(反思:但我在考试的时候居然打错了暴力,多组数据忘记清空,只得了 20 分)
60%:
如果做出了 1989“圆括号”一题,再结合上面的暴力,不难想到 DP 的方法。
记
注意转移的过程中要保证任意时刻左括号个数都必须多于或等于右括号个数。
对于已给定的括号,可以直接跳过(
时间复杂度:
100%:
要保证满足条件,决策位置和合法性都不能不考虑,上面的 DP 已是最优可能,但无法解决 105 这么大规模。因此正解并不是对上面的 DP 再进行玄学优化。
考试的时候其实是有想到贪心的,但却无从下手。正解就是贪心。
输入的时候,先算出每个 ? 的
第一步,什么都不考虑,把全部都变成右括号。当前费用为
之后,从第 1 位开始,从左向右逐位考虑,将到目前为止左括号个数与右括号个数的差值记为
对于一个合法的括号序列,前
所谓调整,就是在
为了最小化费用,显然要选一个使
另外,类似于上面的 DP,对于已给定的括号,如果直接跳过,要注意判断可能出现的在前面选一个变成左括号的时候没得选的局面。如果是对
时间复杂度:
正确性证明:暂略。
参考代码:
#include <algorithm>#include <climits>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <queue>using namespace std;const int MAXN = 1e5 + 100;int c;long long diff[MAXN];int l;char str[MAXN];long long ans;priority_queue <long long, vector<long long>, greater<long long> > pq;void solve() { int k = 0, s = 0; while (!pq.empty()) pq.pop(); for (int i = 0; i < l; i++) { if (str[i] == '(') ++s; else --s; if (str[i] == '?') pq.push(diff[k++]); //将来可以变成左括号 if (s == -1) //不合法的情况,在前面选一个变成左括号 if (pq.empty()) { //没得变的情况,不合法 ans = -1; return; } else { ans += pq.top(); //否则选一个花费最小的变 pq.pop(); s = 1; } } if (s) ans = -1; //到最后左括号比右括号多也不合法}int main(void) { freopen("2088.in", "r", stdin); freopen("2088.out", "w", stdout); while (~scanf("%s", str)) { c = 0; //一开始多组数据忘记清零,暴力都 WA 了 l = strlen(str); for (int i = 0; i < l; i++) c += str[i] == '?'; ans = 0LL; for (int i = 0; i < c; i++) { long long A, B; scanf("%lld%lld", &A, &B); diff[i] = A - B; ans += B; //先全部变成右括号 } solve(); printf("%lld\n", ans); } return 0;}
- [SMOJ2088]魔法练习
- 魔法练习
- 普及练习场 排序Ex 魔法照片
- 魔法
- 魔法
- 叉姐的魔法训练(第一课)---- 初级魔法练习
- 练习赛 魔法串 (补全AC自动机 可持久化树)
- map 魔法 reduce魔法
- 字典魔法
- 轻井泽魔法
- 魔法相册
- 魔法豌豆
- 魔法秀
- 魔法赋值
- Git 魔法
- 魔法效果
- 魔法数字
- 魔法树
- UVa Live 7278
- Linux下多进程避免僵尸进程的方法
- XYNUOJ 第四次考试(STL模块)
- MainActivity 主方法
- 三维数据处理软件架构
- [SMOJ2088]魔法练习
- 7、C程序 数组排序之[插入排序改良:希尔排序]
- CMake undefined reference to 问题
- 更新数据库表信息时抛异常java.sql.SQLException: Parameter index out of range (1 > number of parameter
- 算法——快速排序
- jsonp概论
- NIO基础
- linux下安装mysql5.7
- Python自学