貪心演算法-最大不相交區間數問題
阿新 • • 發佈:2019-01-08
數學模型
數軸上有n個區間[Ai,Bi],要求選擇儘量多的區間,並使得這些區間不存在交集。
解題思路
貪心策略,按照B1<=B2<=B3……的方式進行排序,然後從前向後遍歷區間,每當遇到可以加入集合的區間,就把它加入集合。(集合代表解的集合)
證明
我們對A1,A2……的關係分以下幾種情況考慮:
A1>A2。此時區間2包含區間1。這種情況下顯然不會選擇區間2,因為選擇區間1會留下更多的剩餘空間。不僅區間2如此,以後所有區間中只要有一個i滿足A1>Ai,i都不要選。即此種情況下,選擇區間1是明智的,與策略一致。
排除情況1後,一定有A1<=A2<=A3……。
例題
看電視
題目描述
暑假到了,小明終於可以開心的看電視了。但是小明喜歡的節目太多了,他希望儘量多的看到完整的節目。
現在他把他喜歡的電視節目的轉播時間表給你,你能幫他合理安排嗎?
輸入
輸入包含多組測試資料。每組輸入的第一行是一個整數n(n<=100),表示小明喜歡的節目的總數。
接下來n行,每行輸入兩個整數si和ei(1<=i<=n),表示第i個節目的開始和結束時間,為了簡化問題,每個時間都用一個正整數表示。
當n=0時,輸入結束。
輸出
對於每組輸入,輸出能完整看到的電視節目的個數。
樣例輸入
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
樣例輸出
5
題解
#include <iostream>
#include <algorithm>
using namespace std;
struct cnt{
int a;
int b;
} tv[103];
int cmd(cnt x, cnt y){
return x.b < y.b;
}
int main(){
int n, i, j, k;
while (cin >> n && n){
for(i = 0; i < n; ++i){
cin >> tv[i].a >> tv[i].b;
}
sort(tv, tv+n, cmd);
j = 0;
k = 0;
for(i = 1; i < n; i++){
if(tv[i].a >= tv[j].b){
++k;
j = i;
}
}
cout << k + 1 << endl;
}
return 0;
}
題目來源