UVa 1422 - Processor(二分 + 贪心 + 优先队列)

来源:互联网 发布:jsp人才系统源码 编辑:程序博客网 时间:2024/05/02 04:39

题意

有N个任务,每个任务只能在开始时间到结束时间之内完成,有任务量。完成所需时间是w / 处理器速度。

输出处理器速度最大值的最小值。

思路

虽然一看就知道是二分,但是怎么Check想了一整天都没想出来。看了别人的题解。

思路是一秒一秒来算。

建一个优先队列,结束时间越短越优先,因为要最快完成。

一秒内能处理的任务量就是处理器的速度mid。

出队,如果能处理完就减掉,不能处理完就减一下任务量,因为任务还木有完成,所以还得入队。

一直重复,直到全部都出队。

代码

  1. #include <cstdio>
  2. #include <queue>
  3. #include <algorithm>
  4. #define LL long long
  5. #define lowbit(x) ((x) & (-x))
  6. const int MAXN = 1e4 + 5;
  7. const int INF = 0x3f3f3f3f;
  8. using namespace std;
  9. struct POINT
  10. {
  11. int st, ed, w;
  12. bool operator < (const POINT &a) const
  13. {
  14. return ed > a.ed;
  15. }
  16. }pit[MAXN];
  17. int n, vmax;
  18. priority_queue<POINT> qu;
  19. int cmp(const POINT &a, const POINT &b)
  20. {
  21. return a.st < b.st;
  22. }
  23. bool Check(int mid)
  24. {
  25. while (!qu.empty()) qu.pop();
  26. int i, j;
  27. int k = 0;
  28. for (i = 1; i <= 20000; i++)
  29. {
  30. while (pit[k].st < i && k != n) qu.push(pit[k++]);
  31. int curLev = mid;
  32. while (!qu.empty() && curLev != 0)
  33. {
  34. POINT cur = qu.top(); qu.pop();
  35. if (cur.ed < i) return false; //取出了过时未完成的任务。
  36. if (cur.w > curLev)
  37. {
  38. cur.w -= curLev;
  39. curLev = 0;
  40. qu.push(cur);
  41. }
  42. else
  43. curLev -= cur.w;
  44. }
  45. }
  46. if (qu.empty() && k == n)
  47. return true;
  48. return false;
  49. }
  50. int Solve()
  51. {
  52. sort(pit, pit + n, cmp);
  53. int l = 0, r = vmax, ans, mid;
  54. while (l <= r)
  55. {
  56. mid = l + (r - l) / 2;
  57. if (Check(mid))
  58. {
  59. ans = mid;
  60. r = mid - 1;
  61. }
  62. else
  63. l = mid + 1;
  64. }
  65. return ans;
  66. }
  67. int main()
  68. {
  69. //freopen("input.txt", "r", stdin);
  70. int T, i, j;
  71. scanf("%d", &T);
  72. while (T--)
  73. {
  74. vmax = 0;
  75. scanf("%d", &n);
  76. for (i = 0; i < n; i++)
  77. {
  78. scanf("%d%d%d", &pit[i].st, &pit[i].ed, &pit[i].w);
  79. vmax += pit[i].w;
  80. }
  81. printf("%d\n", Solve());
  82. }
  83. return 0;
  84. }
0 0
原创粉丝点击