[貪心]活動安排問題2
阿新 • • 發佈:2017-05-13
時間 不能 using air 結束 lag rst color log
題目大意:有若幹個活動,第i個開始時間和結束時間是[Si,fi),同一個教室安排的活動之間不能交疊,求要安排所有活動,最少需要幾個教室?
解題關鍵:策略: 按照開始時間排序優先安排活動,如果沖突,則加一個教室。
1、利用優先隊列
1 #include<bits/stdc++.h> 2 #define INF 0X3F3F3F3F 3 using namespace std; 4 typedef long long ll; 5 string s; 6 pair<int,int>pp[10002]; 7 int a[26]; 8 boolflag[10002]; 9 int main(){ 10 priority_queue<int,vector<int>,greater<int> >q; 11 int n,count=1; 12 cin>>n; 13 for(int i=1;i<=n;i++){ 14 cin>>pp[i].first>>pp[i].second; 15 } 16 sort(pp+1,pp+n+1); 17 q.push(pp[1].second);18 for(int i=2;i<=n;i++){ 19 if(pp[i].first>=q.top()){ 20 q.pop(); 21 q.push(pp[i].second); 22 }else{ 23 count++; 24 q.push(pp[i].second); 25 } 26 } 27 printf("%d\n",count); 28 return 0; 29 }
2、求線段相交的次數
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 vector<pair<int,int> >event; 5 int main(){ 6 int n; 7 scanf("%d",&n); 8 int st,ed; 9 for(int i=0;i<n;i++){ 10 scanf("%d%d",&st,&ed); 11 event.push_back(make_pair(st,1)); 12 event.push_back(make_pair(ed,-1)); 13 } 14 sort(event.begin(),event.end()); 15 int cnt=0,ans=0; 16 for(int i=0;i<event.size();i++){ 17 cnt+=event[i].second; 18 ans=max(ans,cnt); 19 } 20 printf("%d\n",ans); 21 return 0; 22 }
[貪心]活動安排問題2