hihoCoder 1309:任务分配 贪心 优先队列
Posted GeekZRF
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihoCoder 1309:任务分配 贪心 优先队列相关的知识,希望对你有一定的参考价值。
#1309 : 任务分配
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, EN ), 计算最少需要多少台机器才能按时完成所有任务。
同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行。任务切换不需要时间。
输入
第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目。 以下 N 行每行两个整数 Si, Ei,(0 ≤ Si < Ei ≤ 1000000000),表示任务的起至时间。
输出
输出一个整数,表示最少的机器数目。
- 样例输入
-
5 1 10 2 7 6 9 3 4 7 10
- 样例输出
-
3
题目连接:http://hihocoder.com/problemset/problem/1309
题意:n个时间,每个时间有开始时间和结束时间,问至少需要几台机器才能全部完成。
思路:贪心。时间按s,e升序排序。利用优先队列。
代码:#include<iostream> #include<cstdio> #include<algorithm> #include<queue> using namespace std; const int MAXN=1e6+100; struct cmp { bool operator ()(int &a,int &b) { return a>b; } }; priority_queue<int,vector<int>,cmp>Q; struct node { int s,e; } x[MAXN]; int cmp(node a,node b) { if(a.s!=b.s) return a.s<b.s; else return a.e<b.e; } int sign[MAXN]; int main() { int i,j,n; while(~scanf("%d",&n)) { for(i=1; i<=n; i++) scanf("%d%d",&x[i].s,&x[i].e); sort(x+1,x+n+1,cmp); Q.push(0); for(i=1; i<=n; i++) { if(Q.top()<=x[i].s) { Q.pop(); Q.push(x[i].e); } else Q.push(x[i].e); } cout<<Q.size()<<endl; } return 0; }
以上是关于hihoCoder 1309:任务分配 贪心 优先队列的主要内容,如果未能解决你的问题,请参考以下文章