标签:cin define 结束 space nlogn div bool ++ style
有n项活动申请使用同一个礼堂,每项活动有一个开始时间和一个截止时间。如果任何两个活动不能同时举行,如何选择这些活动,从而使得被安排的活动数量达到最多。
共有10项活动,开始时间和结束时间分别为
{(1,4),(3,5),(5,7),(0,6),(3,8),(5,9),(8,11),(6,10),(8,12),(2,13),(12,14)}
则顺序为{(1,4),(3,5),(0,6),(5,7),(3,8),(5,9),(6,10),(8,11),(8,12),(2,13),(12,14)},则可以安排的活动有4个,分别为(1,4),(5,7),(8,11),(12,14)。
则顺序为{(0,6),(1,4),(2,13),(3,5),(3,8),(5,7),(5,9),(6,10),(8,11),(8,12),(12,14)},则可以安排的活动有3个,分别为(0,6),(6,10),(12,14)。
则顺序为{(3,5),(5,7),(12,14),(1,4),(8,11),(5,9),(6,10),(8,12),(3,8),(0,6),(2,13)},则可以安排的活动有3个,分别为(3,5),(5,7),(12,14)。
按照每项活动的结束时间从小到大排序后的顺序进行即可。
用sort函数自定义排序,复杂度为O(NlogN);遍历一遍数组,复杂度为O(N)。因此总复杂度为O(N+NlogN)。
/*
author: keke
project name:相容问题
Time Complexity: O(nlog(n))
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
const int maxn=110;
int n,m,t,is,cnt,ans;
struct xx{
int l,r;
}xx[maxn];
bool cmp(struct xx a,struct xx b){
if(a.r==b.r)return a.l<b.l;
return a.r<b.r;
}
int main(){
ios::sync_with_stdio(false);
cout<<fixed<<setprecision(2);
while(cin>>n){
if(!n)return 0;
int ans=0,cnt=0;
for(int i=1;i<=n;i++)cin>>xx[i].l>>xx[i].r;
sort(xx+1,xx+1+n,cmp);
for(int i=1;i<=n;i++){
if(cnt<=xx[i].l){
++ans;
cnt=xx[i].r;
}
}
cout<<ans<<"\n";
}
return 0;
//good job!
}
标签:cin define 结束 space nlogn div bool ++ style
原文地址:https://www.cnblogs.com/powerkeke/p/12923064.html