题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6180
Schedule
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 153428/153428 K (Java/Others)Total Submission(s): 642 Accepted Submission(s): 243
Problem Description
There are N schedules, the i-th schedule has start time
si
and end time
ei
(1 <= i <= N). There are some machines. Each two overlapping schedules cannot be performed in the same machine. For each machine the working time is defined as the difference between
timeend
and
timestart
, where time_{end} is time to turn off the machine and
timestart
is time to turn on the machine. We assume that the machine cannot be turned off between the
timestart
and the
timeend
.
Print the minimum number K of the machines for performing all schedules, and when only uses K machines, print the minimum sum of all working times.
Print the minimum number K of the machines for performing all schedules, and when only uses K machines, print the minimum sum of all working times.
Input
The first line contains an integer T (1 <= T <= 100), the number of test cases. Each case begins with a line containing one integer N (0 < N <= 100000). Each of the next N lines contains two integers
si
and
ei
(0<=si<ei<=1e9)
.
Output
For each test case, print the minimum possible number of machines and the minimum sum of all working times.
Sample Input
1 3 1 3 4 6 2 5
Sample Output
2 8
Source
Recommend
解析:维护一个multiset(有重复元素的set),把所有区间按照左区间从小到大排下序,然后遍历所有区间,二分set里面所有右区间找比当前左区间大的区间,如果找到了,把原来的区间删了,加入当前区间,实际上这就是在一台机器上完成的任务,记录机器没有工作的时间;如果没找到,那么久开始一个新的机器,把当前区间加入即可。一直遍历,最后set大小就是所要的机器数,在遍历的过程中记录下时间
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 100009;
typedef long long LL;
typedef pair<int, int> P;
multiset<P> s;
P sg[N];
int main()
{
int t, n;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
s.clear();
LL ans = 0;
for(int i = 0; i < n; i++) scanf("%d%d", &sg[i].first, &sg[i].second), ans += sg[i].second - sg[i].first;
sort(sg, sg+n);
int res = 0;
s.insert(make_pair(1e9+1, 1e9));
set<P> :: iterator it;
for(int i = 0; i < n; i++)
{
it = s.upper_bound(sg[i]);
if(it == s.begin())
{
res++;
s.insert(make_pair(sg[i].second, sg[i].first));
continue;
}
it--;
ans += sg[i].first - it->first;
s.insert(make_pair(sg[i].second, sg[i].first));
s.erase(it);
}
printf("%d %lld\n", res, ans);
}
return 0;
}