题目出处
像这种已知各活动的起止时间,求能参加活动(兼容)的最大个数的问题,关键在于各活动的结束时间,依照结束时间将各活动(从小到大)排序,这样当一个活动结束时,可以立刻找出起始时间与这个活动结束时间间隔最小(或为0)且持续时间最短的活动,重复这个过程知道所有活动都已遍历。
附代码:
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
ll A[1005][2];
int main(){
ll n; cin>>n;
for(int i=0;i<n;i++){
ll a,b; cin>>a>>b;
A[i][0]=a; A[i][1]=b;
}
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(A[j][1]>A[j+1][1]){
int temp=A[j][1]; A[j][1]=A[j+1][1]; A[j+1][1]=temp;
int t2=A[j][0]; A[j][0]=A[j+1][0]; A[j+1][0]=t2;
}
}
}
int k=1; int l=A[0][1];
while(1){
int flag=0;
for(int i=0;i<n;i++){
if(A[i][0]>=l){
l=A[i][1]; k++; flag=1;
}
}
if(!flag) break;
}
cout<<k<<endl;
}