1572: [Usaco2009 Open]工作安排Job

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 814  Solved: 365
[Submit][Status]

Description

Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间。 他的工作日从0时刻开始,有1000000000个单位时间(!)。在任一时刻,他都可以选择编号1~N的N(1 <= N <= 100000)项工作中的任意一项工作来完成。 因为他在每个单位时间里只能做一个工作,而每项工作又有一个截止日期,所以他很难有时间完成所有N个工作,虽然还是有可能。 对于第i个工作,有一个截止时间D_i(1 <= D_i <= 1000000000),如果他可以完成这个工作,那么他可以获利P_i( 1<=P_i<=1000000000 ). 在给定的工作利润和截止时间下,FJ能够获得的利润最大为多少呢?答案可能会超过32位整型。

Input

第1行:一个整数N. 第2~N+1行:第i+1行有两个用空格分开的整数:D_i和P_i.

Output

输出一行,里面有一个整数,表示最大获利值。

Sample Input

3
2 10
1 5
1 7

Sample Output

17

HINT

第1个单位时间完成第3个工作(1,7),然后在第2个单位时间完成第1个工作(2,10)以达到最大利润

Source

Gold

题解:一个比较经典的问题,直接建立一个堆,然后倒着来,到每个时间节点就加上一波,然后将最大的一坨取出来即可

  1. var
  2. i,j,k,l,m,n,head:longint;
  3. ans:int64;
  4. b:array[..,..] of longint;
  5. a,lef,rig,fix:array[..] of longint;
  6. function min(x,y:longint):longint;inline;
  7. begin
  8. if x<y then min:=x else min:=y;
  9. end;
  10.  
  11. procedure swap(var x,y:longint);inline;
  12. var z:longint;
  13. begin
  14. z:=x;x:=y;y:=z;
  15. end;
  16. procedure sort(l,r:longint);inline;
  17. var i,j,x,y:longint;
  18. begin
  19. i:=l;j:=r;x:=b[(l+r) div ,];
  20. repeat
  21. while b[i,]>x do inc(i);
  22. while b[j,]<x do dec(j);
  23. if i<=j then
  24. begin
  25. swap(b[i,],b[j,]);
  26. swap(b[i,],b[j,]);
  27. inc(i);dec(j);
  28. end;
  29. until i>j;
  30. if i<r then sort(i,r);
  31. if l<j then sort(l,j);
  32. end;
  33. procedure merge(var x,y:longint);inline;
  34. begin
  35. if x= then swap(x,y);
  36. if y= then exit;
  37. if a[x]<a[y] then swap(x,y);
  38. merge(rig[x],y);
  39. fix[x]:=min(fix[lef[x]],fix[rig[x]])+;
  40. if fix[lef[x]]<fix[rig[x]] then swap(lef[x],rig[x]);
  41. end;
  42. function cuthead(var head:longint):longint;inline;
  43. begin
  44. cuthead:=a[head];
  45. merge(lef[head],rig[head]);
  46. head:=lef[head];
  47. end;
  48. begin
  49. readln(n);m:=;head:=;
  50. for i:= to n do readln(b[i,],b[i,]);
  51. sort(,n);
  52. j:=;
  53. ans:=;
  54. while true do
  55. begin
  56. i:=j;
  57. if b[i,]<= then break;
  58. while b[i,]=b[j,] do inc(i);
  59. for k:=j to i- do
  60. begin
  61. inc(m);l:=m;
  62. a[m]:=b[k,];lef[m]:=;rig[m]:=;fix[m]:=;
  63. merge(head,l);
  64. end;
  65. for k:= to b[j,]-b[i,] do
  66. begin
  67. if head= then break;
  68. ans:=ans+cuthead(head);
  69. end;
  70. j:=i;
  71. end;
  72. writeln(ans);
  73. readln;
  74. end.

1572: [Usaco2009 Open]工作安排Job的更多相关文章

  1. BZOJ 1572: [Usaco2009 Open]工作安排Job( 贪心 )

    贪心... 按截止时间排序 , 然后从小到大考虑 . 假设当前考虑第 i 个任务 , 若目前已选工作数 < D_i , 那就选 i ; 否则 若已选工作中利润最小的比 P_i 小 , 那就去除它 ...

  2. 【BZOJ 1572】 1572: [Usaco2009 Open]工作安排Job(贪心+优先队列)

    1572: [Usaco2009 Open]工作安排Job Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单 ...

  3. BZOJ 1572 [Usaco2009 Open]工作安排Job:贪心 + 优先队列【先放再更新】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1572 题意: 有n个工作,每个工作有一个截止日期dead[i]和收益pay[i]. 完成一 ...

  4. 1572: [Usaco2009 Open]工作安排Job[贪心]

    Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单 ...

  5. 【BZOJ】1572: [Usaco2009 Open]工作安排Job

    [题意]给定n项工作的截止时间和价值,每项工作需要1单位时间完成,求最大价值.n<=10^5. [算法]贪心+堆 [题解] 如果是访问到x时将d[x]前的点从价值最大的能加就加是错误的贪心,因为 ...

  6. bzoj 1572: [Usaco2009 Open]工作安排Job

    Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单 ...

  7. BZOJ 1572: [Usaco2009 Open]工作安排Job 贪心 + 堆 + 反悔

    Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50, ...

  8. bzoj 1572: [Usaco2009 Open]工作安排Job【贪心+堆】

    先按照时间顺序加,价值塞进小根堆里,碰到不合法情况就从堆里减去 #include<iostream> #include<cstdio> #include<queue> ...

  9. BZOJ1572: [Usaco2009 Open]工作安排Job

    1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 775  Solved: 337[Submit ...

随机推荐

  1. jQuery 动画的执行

    jQuery 动画的执行 <%@ page language="java" import="java.util.*" pageEncoding=" ...

  2. 从php到浏览器的缓存机制,不得不看!

    所有的php程序员都知道在php脚本里面执行 echo "1";访客的浏览器里面就会显示"1". 但是我们执行下面的代码的时候,并不是显示"1&quo ...

  3. 从零开始学习C#——HelloWorld(一)

    从零开始学习C# 老规矩Hello World 您的第一个程序 visual studio 如何使用就不说了 //编程的开始,Hello World! program in C# using Syst ...

  4. Spring Boot踩坑之路一

    Takes an opinionated view of building production-ready Spring applications. Spring Boot favors conve ...

  5. T-SQL 语句

    表的创建:1.创建列(字段):列名+类型2.设置主键列(primary key):能够唯一标识一条数据3.设置唯一(unique):内容不能重复4.外键关系:一张表(从表)其中的某列引用自另外一张表( ...

  6. 有关C#分部类型的一些叙述

    等待着元宵节的到来,过完元宵,这个年也算是过完了,也得开始出去挣钱了,过年回家感觉每个人都觉得很牛,只有自己太渣,为了避免年底再出现这样尴尬的局面,还是需要努力干活.争取当上CEO,赢取白富美,走上人 ...

  7. The type or namespace name '****' could not be found

    偶尔会在编译时出现“The type or namespace name '****' could not be found (are you missing a using directive or ...

  8. java字节数组格式化为十六进制字符串

    /** * 格式化byte * * @param b * @return */ public static String byte2hex(byte[] b) { char[] Digit = { ' ...

  9. 特殊的string类型

    1.前言 string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢? 原因就是.Net考虑到假如大量的操作string对象的时候,大量 ...

  10. 关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。

    ( 转载请务必标明出处:http://www.cnblogs.com/linguanh/, 本文出自:[林冠宏(指尖下的幽灵)的博客]) 前序 本文将会把一下三个问题阐述清楚以及一个网上的普遍观点的补 ...