可以反悔的贪心

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

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

原文地址:https://www.cnblogs.com/dorbmon/p/11666918.html

时间: 2024-10-08 20:45:58

可以反悔的贪心的相关文章

[CTSC2010]星际旅行(带反悔的贪心)

题目 有一棵树,限制从每个点出发的次数最多为\(c_i\),对于每个点i,求1到i的路径最多经过多少次边\(,(n\leq 40000)\),保证每个点的\(c\)大于其入度 解法1 直接莽?拆点,中间连容量为\(c_i\)费用为0的边,点与点之间连容量为inf费用为1的边,从1到每个点i跑一次最大费用最大流即可 显然过不了本题数据 解法2 考虑树形DP解决这个网络流问题 递推解决问题?本题难点在于:确定递推顺序然后确定一个点的答案 由于每个点的\(c\)都大于其入度,那么从1开始一定可以将所有

8.7联考题解

前两题很水啊--没必要开三篇了就扔到一篇里去了.改水题异常艰难,代码量很小然而我又被什么奇怪的东西绊住了. Passward 时间限制: 1 Sec  内存限制: 512 MB 题目描述 你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s. 传说打开庙门的密码是这个字符串的一个子串 t,并且 t 既是 s 的前缀又是 s 的后缀并且还在 s 的中间位置出现过一次. 如果存在这样的串,请你输出这个串,如有多个满足条件的串,输出最长的那一个. 如果不存在这样的串,输出"Just a legen

[题解]NKOJ 3102取数(乱搞)

题目描述 n个整数组成的一个环,现在要从中取出m个数,取走一个数字就不能取跟它相邻的数字(相邻的数不能同时取).要求取出的数字的总和尽可能大,问这个最大和是多少? 如果无解,请输出"Error!" 输入输出格式 输入格式: 第一行包含两个正整数n.m. 第二行为n个整数Ai. 输出格式: 仅一个整数,表示所求结果.如果无解输出"Error!",不包含引号. 输入输出样例 输入样例#1: 7 3 1 2 3 4 5 6 7 输出样例#1: 15 输入样例#2: 7 4

[UOJ455][UER #8]雪灾与外卖——堆+模拟费用流

题目链接: [UOJ455]雪灾与外卖 题目描述:有$n$个送餐员(坐标为$x_{i}$)及$m$个餐厅(坐标为$y_{i}$,权值为$w_{i}$),每个送餐员需要前往一个餐厅,每个餐厅只能容纳$c_{i}$个送餐员,一个送餐员去一个餐厅的代价为$|x_{i}-y_{j}|+w_{j}$,求最小代价. 首先这个题可以暴力建图跑费用流,具体做法就不说了.现在我们考虑模拟费用流的过程,也就是模拟贪心及匹配中反悔的过程. 我们对送餐员和餐厅分别开一个小根堆然后从左往右决策每个坐标位置的人或餐厅的选择

牛券Cow Coupons

USACO12FEB 久违的奶牛题. 题意: FJ准备买一些新奶牛,市场上有 $ N $ 头奶牛 $ (1 \leq N \leq 50000) $ ,第i头奶牛价格为 $ P_i (1 \leq P_i \leq 10^9) $ .FJ有K张优惠券,使用优惠券购买第i头奶牛时价格会降为 $ C_i(1\leq C_i \leq P_i) $ ,每头奶牛只能使用一次优惠券.FJ想知道花不超过 $ M(1 \leq M \leq 10^{14}) $ 的钱最多可以买多少奶牛? 解法: 在ZR时摸鱼

2019-9-9做题记录

1.罗马游戏: 左偏树模板. 小根堆:合并选小的做根,记为$r1$,然后把$r2$合并到$r1$右边(原$r1$左边长,右边短),然后更新父亲,判断长度关系交换儿子,更新长度. 删除用$fhq_treap$的删除方式. 查找用并查集的方法,但是不带路径压缩. 2.棘手的操作: 联通块内最小值用左偏树维护,全局最小值用$multiset$维护. 3.城池攻占: 把所有的骑士一块处理,因为每一个骑士只会加入军团一次.死掉一次,所以如果我们只维护这些事件,复杂度是正确的,很容易想到左偏树. 注意到无论

考试总结 模拟64

问题: 1.时间安排还合理,T1T2共130分每道50分钟,T2对于m的规律没找就先看了T3 然后状态极度下滑,T3的各subtask的思路在脑海中交织,然后什么都没想出来 其实不要给自己太高定位,一定要一步步来,不管是不是水题,先从sub1开始想,注意检查心态,不要长时间盲目思考 2.T3最后打了线段树骗20分,本来很基础的线段树,然后就.... 1.修改没pushup!!!2. t[lc].f+=t[k].f,t[lc].sum+=t[k].f*(t[lc].r-t[lc].l+1); T1

【转】二叉堆与优先队列

目录 1.插入 2.删除 3.查询 1.堆排序 2.用两个堆来维护一些查询第k小/大的操作 中位数 3.利用堆来维护可以“反悔的贪心” 如题,二叉堆是一种基础数据结构 事实上支持的操作也是挺有限的(相对于其他数据结构而言),也就插入,查询,删除这一类 对了这篇文章中讲到的堆都是二叉堆,而不是斜堆,左偏树,斐波那契堆什么的 我都不会啊 更新概要: 无良博主终于想起来要更新辣 upd1:更新5.2.2-对于该子目所阐述的操作“用两个堆来维护一些查询第k小/大的操作”更新了一道例题-该操作对于中位数题

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

[背景描述] 一排 N 个数, 第 i 个数是 Ai , 你要找出 K 个不相邻的数, 使得他们的和最大. 请求出这个最大和. [输入格式] 第一行两个整数 N 和 K. 接下来一行 N 个整数, 第 i 个整数表示 Ai . [输出格式] 一行一个整数表示最大和, 请注意答案可能会超过 int 范围 [样例输入] 3 2 4 5 3 [样例输出] 7 [数据范围] 对于 20% 的数据, N, K ≤ 20 . 对于 40% 的数据, N, K ≤ 1000 . 对于 60% 的数据, N,