Schedule
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 153428/153428 K (Java/Others)Total Submission(s): 1042 Accepted Submission(s): 420
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
题意:有n个需要全部完成工作(时间区间),每台机器同时只能做一份工作,并且机器开机后,除非做完最后一个作业,不然不关机。求在最少机器数的情况下,最少的工作的总时间。
解题思路:首先按照开始时间排序,一个一个工作的扫过去,对于每一个工作,找到结束时间最晚的并且小于等于这个工作的开始时间,让这个机器做这个工作就可以了,二分一些就好了。Algorithm里面的二分比set自带的二分要慢很多
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <map>
#include <climits>
#include <functional>
using namespace std;
#define LL long long
const int INF = 0x3f3f3f3f;
inline char get()
{
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1++;
}
template <class T> inline bool read(T & x)
{
char ch = get();
if (ch == EOF) return false;
while (ch<'0' || ch>'9') ch = get();
x = ch - '0';
while ((ch = get()) >= '0'&&ch <= '9') x = x * 10 + ch - '0';
return true;
}
struct node
{
int l, r;
bool operator<(const node &a)const
{
return l < a.l;
}
}a[100005];
multiset<int> s;
int n;
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d%d", &a[i].l, &a[i].r);
sort(a, a + n);
LL ans = 0;
s.clear();
for (int i = 0; i < n; i++)
{
multiset<int>::iterator it = s.upper_bound(a[i].l);
if (it == s.begin())
{
ans += 1LL * (a[i].r - a[i].l);
s.insert(a[i].r);
}
else
{
it--;
ans += 1LL * (a[i].r - *it);
s.erase(it);
s.insert(a[i].r);
}
}
printf("%d %lld\n", s.size(), ans);
}
return 0;
}