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 }
