一、問題
問題描述:
有n項活動申請使用同乙個地點,每項活動有乙個開始時間和乙個截止時間。如果任何兩項活動不能同時舉行,問如何選擇這些活動,從而使得被安排的活動數量達到最多。
問題建模:
設s為活動的集合,s和f分別為活動的開始和截止時間。
定義:活動i和j相容。求s最大的兩兩相容的活動子集a。
把活動按照截止時間從小到大排序,使得f1<=f2<=…<=fn,然後從前往後挑選,只要和前面選的活動內容相容,就把這項活動選入a。
二、解析
把活動按照截止時間從小到大排序,用乙個flag記錄活動是否能入選。記錄前一次結束的時間從前往後挑選,如果開始時間在前一次結束之後就把flag記為true,否則是false。最後找到flag為true的就是入選的活動了。
三、設計
void
greedy
(int n)
fsort
(a, n)
; bool flag[n+1]
; flag[1]
=true;
//第乙個活動必定安排
int pre=a[1]
.f;int num=1;
for(
int i=
2;i<=n;i++
)else
flag[i]
=false;
}printf
("%d\n"
,num)
;//輸出最大相容活動數
for(
int i=
1; i<=n; i++)}
}
四、分析
演算法複雜度o(n)。只需要線性的時間就能選出最優解。
通過資料驗證根據活動開始/結束時間或活動進行時間進行非降序排序得到的結果:
可以得到,按照活動結束時間進行排序後才會得到最優解。
原始碼在這
請多指教!!
演算法分析與實踐 作業10 相容問題
相容問題,解析時給出其他幾種貪心策略 如按開始時間從小到大 每個活動時間的占用時間等 並給出這些貪心策略無法實現最優的反例。有n項活動申請使用同乙個禮堂,每項活動有乙個開始時間和乙個截止時間。如果任何兩個活動不能同時舉行,問如何選擇這些活動,從而使得被安排的活動數量達到最多。設s 為活動的集合,si...
演算法分析與設計作業10 貪心演算法 相容問題
有n項活動申請使用同乙個禮堂,每項活動有乙個開始時間和乙個截止時間。如果任何兩個活動不能同時舉行,問如何選擇這些活動,從而使得被安排的活動數量達到最多。將輸入的一組開始與截至時間按結束時間公升序排列 依次遍歷每個活動,根據已選擇的最後乙個活動的結束時間和遍歷到的活動的開始時間來判斷是否將該活動選擇。...
演算法 test10 相容問題
相容問題,解析時給出其他幾種貪心策略 如按開始時間從小到大 每個活動時間的占用時間等 並給出這些貪心策略無法實現最優的反例。把活動按照截止時間從小到大排序,使得f1 f2 fn,然後從前向後挑選,只要與前面選的活動相容,就可以把項活動選入a。k 4 1 選擇活動1,截止時間最早 活動2,3與活動1不...