第1部分 基礎算法(提高篇)--第1章 貪心算法-貪心算法-1422:【例題1】活動安排

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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章