UVA1422-Processor(二分法+优先队列)
option=com_onlinejudge&Itemid=8&category=512&page=show_problem&problem=4168">题目链接
题意:有n个任务,每一个任务必须在在时刻[r,
d]之内运行w的工作量(三个变量都是整数)。处理器运行的速度能够变化,当速度为s时,一个工作量为w的任务须要 运行的时间为w/s个单位时间。
另外不一定要连续运行,能够分成若干块。
求处理器在运行过程中最大速度的最小值。
处理器速度为随意的整数值。
思路:事实上类似于最大值的最小化,也就是在满足各个任务在给定的时间区间内完毕。求速度的最小值。我们能够先将開始时间从小到大排序,之后枚举时间。開始时间比当前枚举时间小的入队伍,越早结束的任务优先处理。之后决定该单位时间处理器处理哪个任务或哪些任务。
注意推断当队列第一个元素的结束时间小于当前枚举时间,就代表这个任务没有在规定时间内完毕。所以速度不够。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm> using namespace std; const int N = 10000000;
const int MAXN = 10005; struct Work{
int r, d, w;
friend bool operator < (Work a, Work b) {
return a.d > b.d;
}
}work[MAXN]; int n; int cmp(Work a, Work b) {
return a.r < b.r;
} int judge(int mid) {
priority_queue<Work> q;
Work state;
int cnt = 0;
for (int i = 1; i <= 20000; i++) {
if (!q.empty()) {
state = q.top();
if (state.d < i) {
return false;
}
}
while (cnt < n && work[cnt].r + 1 <= i) {
q.push(work[cnt++]);
}
int sum = mid;
while (sum && !q.empty()) {
state = q.top();
q.pop();
if (sum < state.w) {
state.w -= sum;
sum = 0;
q.push(state);
}
else
sum -= state.w;
if (cnt == n && q.empty())
return true;
}
}
return false;
} int main() {
int cas;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d%d%d", &work[i].r, &work[i].d, &work[i].w); sort(work, work + n, cmp);
int L = 0, R = N, mid;
while (L < R) {
mid = L + (R - L) / 2;
if (judge(mid))
R = mid;
else
L = mid + 1;
}
printf("%d\n", L);
}
return 0;
}
UVA1422-Processor(二分法+优先队列)的更多相关文章
- uva1422 二分法+优先队列贪心
题意:有n个任务,每个任务必须在在时刻[r, d]之内执行w的工作量(三个变量都是整数).处理器执行的速度可以变化,当速度为s时,一个工作量为w的任务需要 执行的时间为w/s个单位时间.另外不一定要连 ...
- uva 1422 - Processor(二分+优先队列)
题目链接:uva 1422 - Processor 题目大意:有一个机器要处理一些问题,给出这些问题可以开始的时间和必须完成的时间,以及任务的工作量,问说机器必须以最少每秒多少得工作量才能完成这些任务 ...
- UVaLive 4254 Processor (二分+优先队列)
题意:有n个任务,每个任务有三个参数,r,d,w,表示该任务必须在[r,d]之间执行,工作量是w,处理器执行速度可以变化,当执行速度是s的时候, 一个工作量是w的任务需要需要的执行时间是w/s个工作单 ...
- UVALive 4254 Processor ——(二分+优先队列处理)
题目是求最小化最大值,很显然是二分,但是二分以后怎么判断mid是否可行并不容易. 代码参考了网上一个博客的代码.巧妙之处在于一秒一秒的考虑,这样可以把处理速度mid直接转化成1秒内实际的量来解决(避免 ...
- POJ2010 Moo University - Financial Aid(二分法)
题目地址 分析:如果用二分法,关键是score和aid分开排序,score排序是为了充分利用中位数的性质,这样就可以确定m左右必须各选N/2个,到这之后有人是用dp求最优解,可以再次按照aid排序一次 ...
- 二分法 Binary Search
二分法还是比较常见和简单的,之前也遇到过一些二分的相关题目,虽然不难,但是每次都需要在边界问题上诸多考虑,今天听了九章算法的课程,学习到一种方法使得边界问题简单化. 二分法的几个注意点: 1. mid ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 数据结构:优先队列 基于list实现(python版)
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Minion-Xu #list实现优先队列 class ListPriQueueValueE ...
- python优先队列,队列和栈
打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) ...
随机推荐
- iOS学习笔记45-Swift(五)协议
一.Swift协议 协议是为方法.属性等定义一套规范,没有具体的实现,类似于Java中的抽象接口,它只是描述了方法或属性的骨架,而不是实现.方法和属性实现还需要通过定义类,函数和枚举完成. 1. 协议 ...
- CS231n笔记 Lecture 4 Introduction to Neural Networks
这一讲主要介绍了神经网络,基本内容之前如果学习过Andrew的Machine learning应该也都有所了解了.不过这次听完这一讲后还是有了新的一些认识. 计算图 Computational gra ...
- Node.js 文件输入
最近在尝试用 JavaScript (Node.js) 写题.为此,特地看了 ECMAScript 2017 Language Specification(大雾).写题一般是从文件输入,确切地说是,将 ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...
- mybatis的双数据源创建
一.jdbc中: jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://202.108.211.55:3306/app-apm?useUnic ...
- 【前端学习笔记】2015-09-10~~~~ css层叠样式表~~格式
关于颜色的定义: 有几种方式:1.直接接英文单词 2.#16进制 3.rgb(100%:0%:0%)或者里面写像素,此处百分号不能省略. 加多个属性时,用“;”分开 前面如果是定义标签的样式时, ...
- unix网络编程第四章----基于TCP套接字编程
为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int ...
- Linux 之 服务以及进程
服务以及进程 参考教程:[千峰教育] 命令: vmstat: 结果: procs -----------memory---------- ---swap-- -----io---- --system- ...
- jQuery实现tab选项卡效果小demo
html页面: <section> <h2>Section Title</h2> <ul class="tab-nav"> < ...
- jenkins发布普通项目、配置自动上线自动部署
1.以root用户运行jenkins是不专业的 刚开始用jenkins时用jenkins这个普通用户运行程序,始终无法连接到gitlab,报错如下: 先是把修改jenkins上的git路径,将git修 ...