1422:【例題1】活動安排
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 2763 通過數: 1516
【題目描述】
設有n個活動的集合E={1,2,…,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi,且si<fi。如果選擇了活動i,則它在半開時間區間[si,fi)內佔用資源。若區間[si,fi)與區間[sj,fj)不相交,則稱活動i與活動j是相容的。也就是說,當si≥fj或sj≥fi時,活動i與活動j相容。選擇出由相互兼容的活動組成的最大集合。
【輸入】
第1行一個整數n(n≤1000),接下來n行,每行兩個整數si和fi。
【輸出】
輸出儘可能多的互相兼容的活動個數。
【輸入樣例】
4
1 3
4 6
2 5
1 7
【輸出樣例】
2
思路: 所有活動都有一個起始時間和結束時間,映射到數軸上,將每個活動的起始時間點和結束時間點之間的連線看成一條線段,那麼求解問題的任務,就是在對應的數軸上選擇儘可能多的不相交的線段。貪心策略:將每個活動的結束時間從小到大排序,每次選擇最早的結束時間,這樣接下來能選擇更多的不相交的活動。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,ans = 1,t;
struct node{
int s;
int e;
}a[1005];
bool cmp(node x, node y){
return x.e < y.e;
}
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d%d",&a[i].s,&a[i].e);
sort(a+1,a+1+n,cmp);//排序
t = a[1].e;//將第一個尾結點賦值到t
for(int i = 2; i <= n; i++)//第二個開始的頭結點大於前面一個尾結點,ans+1,更新尾結點
{
if(a[i].s >= t)
{
ans++;
t = a[i].e;
}
}
printf("%d",ans);
return 0;
}