• [题解] 优先队列优化贪心&$CF2C$


    [题解] 优先队列优化贪心&(CF2C)

    原题链

    做法

    因为处理这个问号的时候具有不确定性,所以我们干脆把所有的问号在一开始的时候全部初始化成右括号,这个时候再来看如果右括号多了,就可以把一些问号变成的右括号转换成左括号,这个操作的代价就是(a[i] - b[i])(a[i],b[i])分别表示把第(i)个括号换成左括号和右括号的代价,那么就把所有的问号都用这种形式放到小根堆里即可。

    这样做的一个好处就是不需要考虑一个括号是变成左括号还是右括号,转而只要考虑是否变成左括号,只需要在计算权值的时候稍微处理一下即可

    代码

    #include <bits/stdc++.h>
    using namespace std;
    priority_queue < pair < int , int > > q;//小根堆
    int a[50010],b[50010];
    string s;
    string ss;
    int main(){
        cin>>s;
        int cnt = 0,l = 0,r = 0;
        ss = s;
        for (int i = 0;i < s.length();i++) {
            if (s[i] == '(')l++;
            else if (s[i] == ')')r++;
            if (s[i] == '?') {
                ss[i] = ')';
                cin>>a[i]>>b[i];
                cnt++;
            }
        }
        if (s[0] == ')' || s[s.length() - 1] == '(' || abs(l - r) > cnt) {
            cout<<-1<<endl;
            return 0;
        }
        long long ans = 0;
        l = 0,r = 0;
        if (s[0] != '(')ss[0] = '(';//如果一开始就是问号那么一定改为左括号
        l++;
        for (int i = 1;i < ss.length();i++) {
            if (s[i] == '?')q.push(make_pair (b[i] - a[i],i));
            if (ss[i] == '(')l++;
            if (ss[i] == ')')r++;
            if (r > l) {
                pair < int , int > tmp = q.top();
                q.pop();
                int x = tmp.second;
                r--;l++;
                ss[x] = '(';
            }
        }
        if (l != r) {
            cout<<-1<<endl;
            return 0;
        }
        if (ss[ss.length() - 1] != ')') {
            cout<<-1<<endl;
            return 0;
        }
        for (int i = 0;i < s.length();i++) {
            if (s[i] == '?') {
                if (ss[i] == '(')ans += a[i];
                else if (ss[i] == ')')ans += b[i];
            }
        }
        cout<<ans<<endl;
        cout<<ss<<endl;
        return 0;
    }
    
  • 相关阅读:
    软件工程第一个个人小程序
    关于程序的单元测试
    求整数数组中子数组最大的和
    电梯调度程序开发 付亚飞 段兴林
    每天听英语系列一
    去除U盘写保护
    显示pdf格式的图片
    在页面判断起始时间是否大于结束时间
    从页面上灵活增删改查
    柱形图,饼状图,折线图JavaScript
  • 原文地址:https://www.cnblogs.com/czy--blog/p/14043032.html
Copyright © 2020-2023  润新知