您的位置:首页 > 大数据 > 人工智能

2017 Multi-University Training Contest 10 1010 Schedule HDU 6180 (贪心)

2017-08-24 20:30 489 查看
题意: 有若干个活动,第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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU 多校 贪心
相关文章推荐