题目链接:uva 1422 - Processor

题目大意:有一个机器要处理一些问题,给出这些问题可以开始的时间和必须完成的时间,以及任务的工作量,问说机器必须以最少每秒多少得工作量才能完成这些任务。

解题思路:二分答案,答案的上限是MaxWork * MaxN(全在一秒内完成)。然后就是判断说在c的工作量小是否能完成任务。因为处理一个问题的时间可以不连续,所以给解题增加了难度。

现将任务按照开始的时间从小到大排序,然后枚举时间区间。开始时间比当前枚举时间小的话入队。

队列用优先队列,结束时间较小的优先满足。

当队列中的第一个元素的结束时间小于当前枚举时间的起始值时,返回false,因为不会再有时间片可以用于解决该问题。

#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm> using namespace std; const int N = 10005; struct state {
int x, y, w, d;
state() { d = 0; }
friend bool operator < (state a, state b) {
return a.y > b.y;
}
}s[N];
int n, l, r; bool cmp(const state& a, const state& b) {
return a.x < b.x;
} void init() {
l = 0; r = 10000000; scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d%d%d", &s[i].x, &s[i].y, &s[i].w);
sort(s, s + n, cmp);
} bool judge(int c) {
priority_queue<state> q;
int cnt = 0, t = 0;
state k; for (int i = 1; i <= 20000; i++) {
if ( !q.empty()) {
k = q.top();
if (k.y + 1 <= i) return false;
} while (t < n) {
if (s[t].x < i) {
q.push(s[t]);
t++;
} else break;
} int cur = c;
while (cur && !q.empty()) {
k = q.top(); q.pop();
int now = min(cur, k.w - k.d);
k.d += now; cur -= now; if (k.w - k.d) {
q.push(k);
} else {
cnt++;
}
} if (cnt == n) return true;
}
return false;
} int solve() {
while (true) {
if (r - l == 1) break; int mid = (l + r) / 2; if (judge(mid)) r = mid;
else l = mid;
}
return r;
} int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
printf("%d\n", solve());
}
return 0;
}

uva 1422 - Processor(二分+优先队列)的更多相关文章

  1. UVaLive 4254 Processor (二分+优先队列)

    题意:有n个任务,每个任务有三个参数,r,d,w,表示该任务必须在[r,d]之间执行,工作量是w,处理器执行速度可以变化,当执行速度是s的时候, 一个工作量是w的任务需要需要的执行时间是w/s个工作单 ...

  2. UVA.136 Ugly Numbers (优先队列)

    UVA.136 Ugly Numbers (优先队列) 题意分析 如果一个数字是2,3,5的倍数,那么他就叫做丑数,规定1也是丑数,现在求解第1500个丑数是多少. 既然某数字2,3,5倍均是丑数,且 ...

  3. UVa LA 4254 - Processor 二分,贪心 难度: 1

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  4. UVALive 4254 Processor ——(二分+优先队列处理)

    题目是求最小化最大值,很显然是二分,但是二分以后怎么判断mid是否可行并不容易. 代码参考了网上一个博客的代码.巧妙之处在于一秒一秒的考虑,这样可以把处理速度mid直接转化成1秒内实际的量来解决(避免 ...

  5. codeforces 377B Preparing for the Contest 二分+优先队列

    题目链接 给你m个bug, 每个bug都有一个复杂度.n个人, 每个人有两个值, 一个是能力值, 当能力值>=bug的复杂度时才可以修复这个bug, 另一个是雇佣他需要的钱,掏一次钱就可以永久雇 ...

  6. UVa 11627 - Slalom 二分. oj错误题目 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  7. hdu1839(二分+优先队列,bfs+优先队列与spfa的区别)

    题意:有n个点,标号为点1到点n,每条路有两个属性,一个是经过经过这条路要的时间,一个是这条可以承受的容量.现在给出n个点,m条边,时间t:需要求在时间t的范围内,从点1到点n可以承受的最大容量... ...

  8. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

  9. CF802O-April Fools‘ Problem(hard)【wqs二分,优先队列】

    正题 题目链接:https://www.luogu.com.cn/problem/CF802O 题目大意 \(n\)天每条有\(a_i\)和\(b_i\). 每条可以花费\(a_i\)准备至多一道题, ...

随机推荐

  1. delphi xe5 android listbox的 TMetropolisUIListBoxItem

    listbox实现以下效果: \ 关键代码,采用数据集的方式 type PpatientData=^RpatientData; RpatientData= record patient_id:stri ...

  2. Oracle SQL tuning 步骤

    Oracle SQL tuning 步骤 SQL是的全称是Structured Query Language(结构化查询语言).SQL是一个在80年代中期被使用的工业标准数据库查询语言.不要把SQL语 ...

  3. Android版:验证手机号码的正则表达式

    http://blog.csdn.net/dai_zhenliang/article/details/8186249 /** * 验证手机格式 */ public static boolean isM ...

  4. UVA 515 King

    差分约束系统的第一个题目,看了落花大神的博客后,对差分约束有了一定了解,关键在于建图,然后就是判断是否存在负权回路. 关于差分约束系统的解释详见维基百科:http://zh.wikipedia.org ...

  5. android 点滴记录 ICCID IMSI IMEI MEID 关系 和 区别,相关参数在什么情况下可以获取...

    1:ICCID:Integrate circuit card identity 集成电路卡识别码(固化在手机SIM卡中) ICCID为IC卡的唯一识别号码,共有20位数字组成,其编码格式为:XXXXX ...

  6. web storm使用和配置

    官网:http://www.jetbrains.com/webstorm/ webStorm,File=>setting=>JavaScript-Libraries How WebStor ...

  7. Oracle 常用符号CHR

    select  chr(92)||chr(102) from dual; \f select  chr(92)||chr(110) from dual; \n select  chr(92)||chr ...

  8. Linux学习之CentOS6下Mysql数据库的安装与配置

    转自:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 如果要在Linux上做j2ee开发,首先得搭建好j ...

  9. poj2286The Rotation Game(迭代加深dfs)

    链接 把迭代加深理解错了 自己写了半天也没写对 所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索.这种方法虽然会导致重复的遍历 某些结点,但 ...

  10. 关于数组和List之间相互转换的方法

    1.List转换成为数组:返回数组的运行时类型.如果列表能放入指定的数组.否则,将根据指定数组.如果指定的数组的元素比列表的多),那么会将存储列表元素的数组. 返回:包含列表元素的list.add(& ...