传送门:牛客练习赛40

题面:

小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务

第 i 个任务需要花费  x_i 的时间,同时完成第 i 个任务的时间不能晚于 y_i ,时间掌控者向小A提出了一个条件:如果完成第 i 个任务的时间本应是 t ,但小A支付 m 个金币的话,他可以帮助小A在 t-m*z_i  时刻完成第 i 个任务, z_i 是时间参数,会在输入中给出

小A想按时完成所有任务,请你帮他制定一个花费金币最少的方案

注意:不能使得某个任务的花费时间小于 0 ,花费的金币可以不是整数

思路:

首先不难想到一个贪心策略:

1.优先完成截止时间靠前的任务。(以y[i]为关键字,从小到大排序,从左到右处理)

2.如果超出截止时间(t > y[i]),花费尽量少的金币缩短时间( ans += (t-y[i]) / z[i])

这样的贪心策略是存在问题的。如果靠后的任务不够时间完成,同时这个任务的 z 较小,而前面存在 z 特别大的任务,我们应该支付(更少的)金币去缩短前面的时间。

那么我们对上面的贪心策略做出修改:

1.时间充足的情况下(t+x[i] <= y[i]), 优先完成截止时间靠前的任务.(t += x[i])

2.如果超出截止时间(t > y[i]), 找出前面还能缩短时间 且 z[i] 最大的。

这样一来,正确性上没有问题了,但每次暴力查找能够缩短时间且z[i]最大的,复杂度撑不住。

事实上,我们应该想到,最适合维护这个东西的就是堆(priority_queue)了

代码仅供参考:

 #include <bits/stdc++.h>

 using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
#define ____ ios::sync_with_stdio(false);cin.tie(0);
#define fir first
#define sec second
#define mkp make_pair
#define pb push_back
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
const ll INF = (1LL<<60) - 1;
const double eps = 1e-9;
//head
const int maxn = 2e5 + 5;
struct Node{
int k,t,ddl;
bool operator < (const Node & rhs) const {
return ddl < rhs.ddl;
}
} a[maxn];
struct node{
ll k,t;
node(double k,double t):k(k),t(t){};
node(){};
bool operator < (const node & rhs) const {
return k < rhs.k;
}
};
int n;
int main(){
//freopen("data.in","r",stdin);
____
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i].k >> a[i].t >> a[i].ddl;
}
sort(a+1, a+n+1);
priority_queue<node> q;
ll t = 0;
double ans = 0;
for(int i = 1; i <= n; i++){
t += a[i].t;
ll t_in_i = a[i].t;
if(t > a[i].ddl){
while((!q.empty()) && a[i].k < q.top().k){
node u = q.top();
q.pop();
if(u.t > t-a[i].ddl){
u.t -= t-a[i].ddl;
ans += double(t-a[i].ddl)/u.k;
t = a[i].ddl;
if(u.t){
q.push(u);
}
break;
}
else{
t -= u.t;
ans += double(u.t)/u.k;
}
}
if(t > a[i].ddl){
ans += double(t - a[i].ddl)/a[i].k;
t_in_i -= t - a[i].ddl;
t = a[i].ddl;
}
}
if(t_in_i){
q.push(node(a[i].k,t_in_i));
}
}
cout << fixed << setprecision(1) << ans << endl;
return 0;
}

[堆+贪心]牛客练习赛40-B的更多相关文章

  1. 牛客练习赛40 A 小D的剧场 (思维dp)

    链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福  若你摘得大的星星 你将得到大的财富  若两者都能摘得 你将得到 ...

  2. 牛客练习赛40 C 小A与欧拉路(树的直径)

    链接:https://ac.nowcoder.com/acm/contest/369/C 题目描述 小A给你了一棵树,对于这棵树上的每一条边,你都可以将它复制任意(可以为0)次(即在这条边连接的两个点 ...

  3. 牛客练习赛40 C-小A与欧拉路

    求图中最短的欧拉路.题解:因为是一棵树,因此当从某一个节点遍历其子树的时候,如果还没有遍历完整个树,一定还需要再回到这个节点再去遍历其它子树,因此除了从起点到终点之间的路,其它路都被走了两次,而我们要 ...

  4. 牛客练习赛51 **E-数列** (二分,贪心,构造)

    牛客练习赛51 E-数列 链接:https://ac.nowcoder.com/acm/contest/1083/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  5. 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)

    牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...

  6. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  7. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  8. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  9. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

随机推荐

  1. unittest单元测试框架之unittest案例(二)

    1.待测方法: # 加法,返回 a+b 的值 def add(a,b): return a+b # 减法,返回 a-b 的值 def minus(a,b): return a-b # 乘法,返回 a* ...

  2. Struts2+hibernate 结合,实现登陆校验

    完整的项目在github中,数据库使用postgresql,建表语句见项目文档. 下面我分块介绍一下struts2.hibernate.与页面部分的代码. Struts2 UserAction.jav ...

  3. HP-UNIX平台修改Oracle processes参数报错:ORA-27154、ORA-27300、ORA-27301、ORA-27302

    OS 版本     :HP-UX B.11.31Oracle版本:11.2.0.4 (RAC) (一)问题描述 最近发现无法连接上数据库,报错信息为“ORA-00020:maximum number ...

  4. js中两个日期大小比较,获取当前日期,日期加减一天

    一.两个日期大小比较 1.日期参数格式:yyyy-mm-dd // a: 日期a, b: 日期b, flag: 返回的结果 function duibi(a, b,flag) { var arr = ...

  5. RAC Cache Fusion Background Processes

    Acdante--每日三省吾身-- . 什么是缓存融合? .缓存融合工作原理? .缓存融合关键进程以及作用?

  6. Webstorm设置代码提示

    下载路径: https://github.com/virtoolswebplayer/ReactNative-LiveTemplate 本插件可以配合Webstorm设置代码提示. Mac下安装 We ...

  7. 可以提高php编程效率的20个要点

    整理了可以提高php编程效率的20个要点,发博客记录一下,需要的朋友可以参考.    1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row['id' ...

  8. vim ,vi总是卡死,终于找到原因了。

    玩了这么多年linux 居然不知道这个..特此记录. 使用vim时,如果你不小心按了 Ctrl + s后,你会发现不能输入任何东西了,像死掉了一般,其实vim并没有死掉,这时vim只是停止向终端输出而 ...

  9. 电子相册之bitmap

    位图文件主要分为3部分:1. 文件信息头     14Byte 2. 位图信息头     40Byte 3. RGB颜色阵列   由图像长宽尺寸决定 1. 文件信息头 定义结构体: typedef s ...

  10. (数据科学学习手札45)Scala基础知识

    一.简介 由于Spark主要是由Scala编写的,虽然Python和R也各自有对Spark的支撑包,但支持程度远不及Scala,所以要想更好的学习Spark,就必须熟练掌握Scala编程语言,Scal ...