传送门:牛客练习赛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. JAVA正则表达式判断元音

    /* * 判断字符串”qaq”中间的字符是否是元音 * * aeiou * AEIOU * */ (1)正则表达式 (2) (3)

  2. ABAP术语-Transaction

    Transaction 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/19/1112804.html Logical process in ...

  3. 鸟哥私房菜笔记-1 (S0_S3)

    学新东西,总感觉还是看书来的实在,直接看教程上手太慢且没有目的, 接下来先啃鸟哥这本吧,买的第三版,内容在鸟哥站上都有: 鸟哥的 Linux 私房菜 -- 基础学习篇目录 (繁体) http://cn ...

  4. IDEA中使用单元测试@Test等,提示没有 Junit.jar包

    1.File-->Project Structure-->Modules-->右侧Dependencies-->+号-->JARs or directories... 2 ...

  5. 使用NPOI将数据导出Excel

    NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(); NPOI.SS.UserModel.IS ...

  6. 详解 Python3 正则表达式(一)

    本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些批注和修改 ^_^ 正则表达式介绍 正则表达式(Regular expressio ...

  7. C++编译错误杂记

    目录 2018年12月23日 error: no matching function for call to ××× 2018年12月10日 error: expected ')' before '* ...

  8. c语言杨氏矩阵算法

    杨氏矩阵 有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.在这样的数组中查找一个数字是否存在.时间复杂度小于O(N);数组:1 2 32 3 43 4 5 1 3 42 4 54 5 ...

  9. Uber优步北京第四组奖励政策

    优步北京第四组: 定义为2015年7月20日至今激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版最新最详细 ...

  10. 成都Uber优步司机奖励政策(1月8日)

    1月8日 奖励政策 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblog ...