您的位置:首页 > 其它

[贪心]活动安排问题2

2017-05-13 20:28 162 查看

题目大意:有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?

解题关键:策略: 按照开始时间排序优先安排活动,如果冲突,则加一个教室。

 

1、利用优先队列

#include<bits/stdc++.h>
#define INF 0X3F3F3F3F
using namespace std;
typedef long long ll;
string s;
pair<int,int>pp[10002];
int a[26];
bool flag[10002];
int main(){
priority_queue<int,vector<int>,greater<int> >q;
int n,count=1;
cin>>n;
for(int i=1;i<=n;i++){
cin>>pp[i].first>>pp[i].second;
}
sort(pp+1,pp+n+1);
q.push(pp[1].second);
for(int i=2;i<=n;i++){
if(pp[i].first>=q.top()){
q.pop();
q.push(pp[i].second);
}else{
count++;
q.push(pp[i].second);
}
}
printf("%d\n",count);
return 0;
}

 

 

2、求线段相交的次数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<pair<int,int> >event;
int main(){
int n;
scanf("%d",&n);
int st,ed;
for(int i=0;i<n;i++){
scanf("%d%d",&st,&ed);
event.push_back(make_pair(st,1));
event.push_back(make_pair(ed,-1));
}
sort(event.begin(),event.end());
int cnt=0,ans=0;
for(int i=0;i<event.size();i++){
cnt+=event[i].second;
ans=max(ans,cnt);
}
printf("%d\n",ans);
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: