可以反悔的贪心

Posted dorbmon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以反悔的贪心相关的知识,希望对你有一定的参考价值。

第一次遇到这种题,但是我觉得还是不严谨,希望能御剑有同感的朋友交流一下。

https://www.luogu.org/problem/P4053

我写的代码是这样的:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
inline long long read() {
    char ch = getchar(); long long x = 0, f = 1;
    while(ch < 0 || ch > 9) {
        if(ch == -) f = -1;
        ch = getchar();
    } while(0 <= ch && ch <= 9) {
        x = x * 10 + ch - 0;
        ch = getchar();
    } return x * f;
}
struct build {
    ll a;
    ll t;

} datas [150001];
inline bool cmp (const build &a,const build &b) {
    return a.t < b.t;
}
priority_queue <int> q;
signed main(){
#ifndef ONLINE_JUDGE
    freopen ("shit.txt","r",stdin);
#endif 
#ifdef ONLINE_JUDGE
#endif
    int n = read ();
    for (int i = 1;i <= n;++ i) {
        datas [i].a = read ();
        datas [i].t = read ();
    }
    sort (datas + 1,datas + 1 + n,cmp);
    //开始贪心
    int nowt = 0;
    ll ans = 0,nowa = 0;
    for (int i = 1;i <= n;++ i) {
        //其实就是bfs 
        if (nowt + datas [i].a > datas [i].t) {
            //不满足 弄出来一个修复时间最长的然后替换 
            if (!q.empty () && q.top () > datas [i].a && nowt - q.top () + datas [i].a <= datas [i].t) {
                nowt -= q.top ();
                q.pop ();
                q.push (datas [i].a);
                nowt += datas [i].a;
            }
        }else {    //那就直接建造
            ++ ans;
            nowt += datas [i].a;
            q.push (datas [i].a); 
        }
    }
    cout << ans << endl;
    return 0;
}

但是我觉得还是很玄学。也说不出来为啥2333

以上是关于可以反悔的贪心的主要内容,如果未能解决你的问题,请参考以下文章

可以反悔的贪心——贪心+堆维护

可以反悔的贪心——贪心+堆维护

51nod 1476 括号序列的最小代价 (括号题套路+反悔贪心)

[每日一题]:P1016 旅行家的预算 -- 反悔贪心

[APIO/CTSC 2007] 数据备份(反悔贪心)

2017.8.7 联考 就 贪心(有反悔策略)