ACM_區間調度問題(貪心)


Meetings 系列一

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

 多年之后的廣財ACM編協如日中天,下系多個部門,且編協成員幾近過百。這一次,為了慶祝ACM編協近年飛速的發展,各部門都決定在同一天召開會議。請注意:這次由於資源緊張,僅申請到一個報告廳。現在需要你給出安排方案,使得同一天24小時內舉行的會議場次盡可能多。
 為了簡化問題,作如下規定:
(1)每一場會議M(a,b)表示從a時刻開始,b時刻結束(其中,a,b都為整數且8 <= a < b <= 20);
(2)同一時段內報告廳僅允許一個部門進行開會,不同部門交接時可忽略不同場次交換耗費的時間。

Input:

輸入包含多組測試數據,每組數據第一行輸入整數n(0<n<=20)表示一共有n場會議要安排。下面n行依次輸入每一場會議的開始跟結束時刻a,b。

Output:

每一組測試輸出可以安排的場次的最大數目,占一行。

Sample Input:

3 
12 15
12 13
14 18
5 
11 12
13 18
18 20
13 16
16 17

Sample Output:

2
4
解題思路:貪心策略:將所有區間按右端點坐標(結束時間)從小到大排序,順序處理每個區間。如果它與當前已選的所有區間都沒有重疊,則選擇該區間,否則不選。注意:起始時間和結束時間在8-20范圍內。
算法證明--->博主:陽光日志

AC代碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct NODE{
 4     int st,ed;
 5 }node[21];
 6 bool cmp(NODE x,NODE y){
 7     return x.ed<y.ed;  //按結束時間早的升序排
 8 }
 9 int main()
10 {
11     int n,num,k,t,s,e;
12     while(cin>>n){
13         k=-1;
14         for(int i=1;i<=n;++i){
15             cin>>s>>e;
16             if(s>=8 && e<=20){node[++k].st=s;node[k].ed=e;}
17         }
18         sort(node,node+k+1,cmp);
19         num=t=0;
20         for(int i=0;i<=k;++i)
21             if(t<=node[i].st){num++;t=node[i].ed;}
22         cout<<num<<endl;
23     }
24     return 0;
25 }

也可以使用STL中的pair<int,int>。AC代碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,num,k,t,s,e;pair<int,int> itv[21];
 6     while(cin>>n){
 7         k=-1;
 8         for(int i=1;i<=n;++i){   //second記錄起始時間,first記錄結束時間
 9             cin>>s>>e;        //這樣就按照結束時間早的升序排
10             if(s>=8 && e<=20){itv[++k].second=s;itv[k].first=e;}
11         }
12         sort(itv,itv+k+1);num=t=0;
13         for(int i=0;i<=k;++i)
14             if(t<=itv[i].second){num++;t=itv[i].first;}
15         cout<<num<<endl;
16     }
17     return 0;
18 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM