Schedule
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 153428/153428 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
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
题意: 有若干个活动,第i个开始时间和结束时间是[Si,Ei) , 同一个教室安排的活动之间不能交叠,求要安排所有活动,
最少需要几个教室? 并输出所有教室的使用时间之和,每个教室的使用时间是该教师最后一个活动结束时间-第一个
活动开始时间。
思路:对每个活动拆成两点,对所有点排序,On遍历一遍,碰到左端点cnt++,右端点cnt--,维护cnt的最大值即为所
需的教室数量,遍历同时计算时间和,这里要贪心一下,每个左端点都要找离他最近的右端点, 画几个图发现这样不会影响最后答案,用一个栈记录离他最近的右端点。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
struct node
{
ll x;
int flag;
bool operator < (const node &a) const
{
if(x == a.x) return flag > a.flag;
else return x < a.x;
}
}q[2*maxn];
int main(void)
{
int t, n;
cin >> t;
while(t--)
{
scanf("%d", &n);
ll ans = 0;
int num = 1;
for(int i=1;i<=n;i++)
{
scanf("%lld %lld",&q[num].x, &q[num+1].x);
q[num].flag = 1, q[num+1].flag = 2;
ans += q[num+1].x-q[num].x;
num += 2;
}
sort(q+1, q+num);
ll k = - 1, cnt = 0;
stack<ll>s;
while(!s.empty()) s.pop();
for(int i = 1; i < num; i++)
{
if(q[i].flag == 1)
{
cnt++;
if(!s.empty())
{
ll tmp = s.top(); s.pop();
ans += q[i].x - tmp;
}
}
else
{
cnt--;
s.push(q[i].x);
}
k = max(cnt, k);
}
printf("%lld %lld\n", k, ans);
}
return 0;
}