http://hihocoder.com/problemset/problem/1309

题目大意是给定n个任务的起始时间,求问最少需要多少台机器。

有一个贪心的策略就是,如果说对于一个任务结束,必然接一个开始时间最接近这个的比较合算。我们假想一个任务池,那么任务池中最早结束的那个,必然接剩余任务中最早开始的比赛合算(相同开始时间最早结束),而且假设这个任务是P,那么对于一个结束时间晚于P的任务,显然后面的一段时间是浪费的,同样对于一个开始时间晚于P的任务,前面一段是浪费的;

关键在于某个开始时间晚于P,但是结束时间早于P的任务Q,假设接上Q后,还能接一个X,但是接上P后,无法接上X。

首先,对于接P的情况,会导致Q和X,无法接上,或许需要重开一个机器,或者是任务池中存在另一个任务可以接上。对于接Q的情况,会导致P,无法接上,或许需要重开一个机器,或许任务池中存在一个任务可以接上。

对于需要重开一个机器的情况,两者的效果是等价的。那么假设,接Q的情况,任务池中存在另一个任务可以接P,必然,对于接P的情况,存在同样的任务可以接Q,因为P的开始时间早于Q,那么此情况下,两者亦是等价的。

所以,综上,剩余任务中最早开始的比赛合算(相同开始时间最早结束)。

于是只需要开始对所有任务按开始时间正序,次按结束时间正序排序。然后用一个优先队列(堆)维护任务池即可。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <string>
#define LL long long using namespace std; const int maxN = ;
struct node
{
int s, e;
}a[maxN]; bool cmp(node x, node y)
{
if (x.s != y.s) return x.s < y.s;
else return x.e < y.e;
} int n; void work()
{
priority_queue<int, vector<int>, greater<int> > q;
q.push();
int k;
for (int i = ; i < n; ++i)
{
k = q.top();
q.pop();
if (k <= a[i].s) q.push(a[i].e);
else q.push(a[i].e), q.push(k);
}
printf("%d\n", q.size());
} int main()
{
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
while (scanf("%d", &n) != EOF)
{
for (int i = ; i < n; ++i)
scanf("%d%d", &a[i].s, &a[i].e);
sort(a, a+n, cmp);
work();
}
return ;
}

最新文章

  1. CentOS 6.5 安全加固及性能优化 (转)
  2. Cats(3)- freeK-Free编程更轻松,Free programming with freeK
  3. Splinter学习--初探1,模拟百度搜索
  4. fiddler使用教程
  5. C++ Primer:第八章:IO库(续)
  6. 解决MySQL不允许从远程访问的方法
  7. JAXB - Calling marshal
  8. Devexpress之barManager
  9. Count Primes ——LeetCode
  10. 获取webshell的十种方法
  11. 1_NAT模式和桥接模式下的网络配置
  12. 【RL-TCPnet网络教程】第39章 RL-TCPnet之TFTP服务器
  13. laravel 【error】MethodNotAllowedHttpException No message
  14. Dockerfile 中的 COPY 与 ADD 命令
  15. Java面试题复习笔记(前端)
  16. Java 多线程(六)之Java内存模型
  17. SWOT分析法——进行项目管理的高效方法
  18. MySQL入门简介(转载)
  19. oracle with和insert结合使用
  20. OO课程中IDEA相关插件的使用

热门文章

  1. zabbix通过snmp监控网络设备
  2. NOIP 货车运输
  3. idea setting
  4. Spring_事务准备
  5. Address already in use: make_sock: could not bind to address [::]:80
  6. sql行列互换
  7. EF Code-First 学习之旅 级联删除
  8. php学习(二)——html + css
  9. spring3: AOP 之代理机制
  10. Learining TypeScript (一) TypeScript 简介