传送门:牛客练习赛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. NodeJs——入门

    关于NPM: npm 是 nodejs 的包管理和分发工具.它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单. 一 No ...

  2. 【oracle笔记2】约束

    约束 *约束是添加在列上的,用来约束列的. 1. 主键约束(唯一标识) ***非空*** ***唯一*** ***被引用***(外键时引用主键) *当表的某一列被指定为主键后,该列就不能为空,不能有重 ...

  3. 如何优雅的使用C语言绘制一只小猪佩奇

    今天我们来用C语言画一只小猪佩奇---社会.社会....在画小猪佩奇之前,我们先使用带符号的距离长 (signed distance field,SDF) 来画一个圆形. 使用这个方法表示形状,但是这 ...

  4. 小工具:生成半透明背景色的 CSS 代码,不影响子元素透明度

    工具:http://leegorous.net/tools/bg-alpha.html 工具介绍:http://leegorous.net/blog/2010/07/29/generate-css-c ...

  5. 对DataSet,DataRow,DateTable转换成相应的模型

            /// <summary>         /// DataRow 转成 模型         /// </summary>         /// <t ...

  6. python网络编程之协程

    本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的 ...

  7. 实验吧web加了料的报错注入

    知识点: SQL注入中用到的Concat函数详解    http://www.sohu.com/a/219966085_689961 http分割注入 直接根据提示,提交post请求的用户名和密码 结 ...

  8. Facebook 被指收集用户数据:通过照片和文本

    北京时间5月25日消息,在加利福尼亚州进行的对Facebook泄露用户信息一案中,法院对Facebook提起一项新的诉讼,指控该公司通过App收集了用户及他们朋友的信息. 上周向加利福尼亚州圣马特奥市 ...

  9. 成都优步uber司机第一组与第二组的区别

    成都优步uber司机被分成了两组,两组的奖励方式不相同,下面我们先来看看官方给出的奖励方式: 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版最 ...

  10. Android:Gradle报错——No resource found that matches the given name (at 'dialogCornerRadius' with value '?android:attr/dialogCornerRadius')

    今天在使用科大讯飞语音识别SDK进行语音识别功能实现时,莫名的引入了这个错误.不得不吐槽Android Studio再引入别的包时太容易出现冲突,然后导致无法找到R文件,项目无法执行. 1. 具体报错 ...