VJ题目链接

题意:

知道n(n <= 8e6)个工作的完成所需时间q和截止时间d,你一次只能做一个工作。问最多能做多少工作?

思路:

首先很像贪心。观察发现如下两个贪心性质:

1)一定存在一个最优方案,使得截止时间靠后的工作一定比截止时间靠前的工作迟完成(如果完成的话)

证明:

若工作i, j 有 d[i] > d[j]。假设我们现在有一个工作方案,使得i工作在j工作之前完成。

如  ..., i , ... , j , ...

记做 preI, i, midIJ, j, afterJ

此时将这个工作方案的i移动到j后面一个完成,其他不动。

则变成 preI , midIJ , j , i , afterJ

如此交换对 preI和afterJ 部分不会有影响。

对于midIJ部分,由于i的抽出,使得整体完成时间前移,所以不会导致结果更差。

对于j,原先在截止时间内,现在抽出了i,所以一定也在截止时间内。

对于i,因为d[i] > d[j],而现在i的完成时间等同于原先j的完成时间,所以i也一定能完成。

所以这个交换方案不会使得结果更差。

至于会不会变得更好,没有证明,感觉会吧~~迟一点的可以拖一下嘛。。。

2)若存在一种方案,使得 d[i] < d[j] 且 q[i] > q[j] 且选择了i而没有选择j, 则一定可以用j代替i。

证明:略。

所以采用如下贪心策略:

按d从小到大排序,然后依次放入。若放入后爆炸,则看一下前面最大的那个,如果最大的比这个大,踹走后,把这个放进去。

【注:本题证明不完备。可能有问题。如有发现,多谢指正】

坑点:忘记两组数据之间有空行。。。

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. #define N 800100
  8.  
  9. struct Work{
  10. int q, d;
  11. void read() {
  12. scanf("%d%d", &q, &d);
  13. }
  14. bool operator < (const Work &b) const {
  15. if (d != b.d) return d < b.d;
  16. return q < b.q;
  17. }
  18. }works[N];
  19.  
  20. priority_queue<int> que;
  21.  
  22. int main() {
  23. int t;
  24. scanf("%d", &t);
  25. int _ = ;
  26. while (t--) {
  27. !_++?:puts("");
  28. int n;
  29. scanf("%d", &n);
  30. for (int i = ; i < n; i++) {
  31. works[i].read();
  32. }
  33.  
  34. sort(works, works+n);
  35.  
  36. while (!que.empty()) que.pop();
  37. int now = ;
  38. int cnt = ;
  39. for (int i = ; i < n; i++) {
  40. if (now + works[i].q <= works[i].d) {
  41. now += works[i].q;
  42. que.push(works[i].q);
  43. cnt++;
  44. } else {
  45. if (!que.empty() && works[i].q < que.top()) {
  46. now -= que.top();
  47. now += works[i].q;
  48. que.pop();
  49. que.push(works[i].q);
  50. }
  51. }
  52. }
  53. printf("%d\n", cnt);
  54. }
  55. return ;
  56. }

UVALive 3507:Keep the Customer Satisfied(贪心 Grade C)的更多相关文章

  1. UVALive - 3507 Keep the Customer Satisfied

    题意:收到n个订单,每个订单有q,d分别代表做这个的时间,和最晚的完成时间,问你最多能接受几个订单 思路:贪心,我们显然要按最早的完成时间排序,那么接下来,我们用(6,8)和(4,9)做为例子,按照我 ...

  2. UVA1153-Keep the Customer Satisfied(贪心)

    Problem UVA1153-Keep the Customer Satisfied Accept: 222  Submit: 1706Time Limit: 3000 mSec Problem D ...

  3. UVA - 1153 Keep the Customer Satisfied(贪心)

    UVA - 1153 Keep the Customer Satisfied Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: ...

  4. poj 2786 - Keep the Customer Satisfied

    Description   Simon and Garfunkel Corporation (SG Corp.) is a large steel-making company with thousa ...

  5. UVA-1153 Keep the Customer Satisfied (贪心)

    题目大意:有n件工作,做每件工作的消耗时间为s,截止时间为d,问最多能做完几件工作. 题目分析:贪心策略:优先做截止时间靠前的,一旦做不完当前工作,则从已经做过的工作中删去一件耗时最长的,用当前工作取 ...

  6. UVa 1153 Keep the Customer Satisfied (贪心+优先队列)

    题意:给定 n 个工作,已知每个工作要用的时间 q 和 截止时间 d,问你最多完成多少个工作,每次最多能运行一个工作. 析:这个题是贪心,应该能看出来,关键是贪心策略是什么,这样想,先按截止时间排序, ...

  7. UVALive 3835:Highway(贪心 Grade D)

    VJ题目链接 题意:平面上有n个点,在x轴上放一些点,使得平面上所有点都能找到某个x轴上的点,使得他们的距离小于d.求最少放几个点. 思路:以点为中心作半径为d的圆,交x轴为一个线段.问题转换成用最少 ...

  8. 【uva 1153】Keep the Customer Satisfied(算法效率--贪心+优先队列)

    题意:有N个工作,已知每个工作需要的时间和截止时间.要求所有工作穿行完成,第一项任务开始的时间不早于时刻0.问最多能完成多少个工作.(N≤800000) 解法:贪心.可以模型化题目为:已知N个任务的长 ...

  9. UVa 1153 Keep the Customer Satisfied 【贪心 优先队列】

    题意:给出n个工作,已知每个工作需要的时间last,以及截止时间end,(必须在截止时间之前完成)问最多能够完成多少个工作 首先预处理,将这n件任务按照截止时间从小到大排序 然后用一个cur记录当前做 ...

随机推荐

  1. Spring MVC重定向和转发

    技术交流群:233513714 转发和重定向 开始Java EE时,可能会对转发(forward)和重定向(redirect)这个两个概念不清楚.本文先通过代码实例和运行结果图片感性 认识二者的区别, ...

  2. 如何使用API创建OpenStack虚拟机?

    在安装时OpenStack会加载配置信息.有不同的虚拟机模板而且与在Amazon EC2以及其他平台上看到的完全一样.这些配置是内存.vCPU.磁盘容量等的组合,定义了虚拟机的大小及容量.可以使用如下 ...

  3. Pascal “熊猫烧香”(骗人的)

    Pascal仿熊猫烧香病毒,慎用 program japussy;useswindows, sysutils, classes, graphics, shellapi{, registry};cons ...

  4. 自动化测试学习之路--HTML常见元素、属性的简单学习

    如何创建html文件: 使用工具:VSCode 1.双击文件名显示区,可快速新建文件. 2.保存文件,文件名.html 3.输入!(必须是英文的!),按 Tab键,可自动生成html格式的文件,如下: ...

  5. postman与charles的结合使用

    1.准备charles环境 Charles端口一般配置的为8888,不知道怎么配置详见charles文档 打开charles,发现访问浏览器任意页面都是失败. 在浏览器的高级设置中设置代理服务器,以火 ...

  6. 孤荷凌寒自学python第二十天python的匿名函数与偏函数

    孤荷凌寒自学python第二十天python的匿名函数与偏函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python为使函数的使用更加方便高效,可以使用两种特殊的函数简化语句书写. 一 ...

  7. Leetcode 665.非递减数列

    非递减数列 给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列. 我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i ...

  8. linux备忘录-档案与文件系统的压缩与打包

    知识点 文件扩展名与压缩解压缩工具 .Z -> compress程序压缩的档案 .gz -> gzip程序压缩的档案 .bz2 -> bzip2程序压缩的档案 .tar -> ...

  9. jsp处理

    jsp处理步骤: 浏览器发送一个HTTP请求给服务器. Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎.通过使用URL或者.jsp文件来完成. JSP引擎从磁盘中载入JSP ...

  10. Arcgis桌面开发,Python引用GDAL库的方法

    我用的是arcgis10.2,python版本是arcgis自动安装的Pythin2.7 1.下载gdal-111-1700-core.msi和对应的GDAL-1.11.1.win32-py2.7.m ...