1、題目描述
覆蓋長度爲L的河,可以看作是[0,L]的數軸
第i個守衛能夠覆蓋的區間[xi,yi],求至少用幾個守衛就可以覆蓋整個河道
輸入:(n表示守衛個數)
n L
x1 y1
x2 y2
…
輸出:
num
樣例:
input:
4 6
3 6
2 4
0 2
4 7
output:
3
解題思路:
1) 先對守衛區間進行排序(依據xi從小到大排序,若xi相等則按yi從大到小排序)
2) 遍歷所有區間,如果該守衛區間是有效的,即xi<=start && yi>start,記錄該區間。
由於區間是已經排序好的,所以記錄的最後一個包含數軸起始的區間是最終有效區間之一,flag=1。
3)如果flag=1,則將該區間加入到最終有效區間裏,然後將數軸的起始start改爲上一個有效區間的yi。
代碼實現:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 100
struct node
{
int l;
int r;
bool operator<(node b){
if(l != b.l) return l<b.l;
else return r>b.r;
}
}a[maxn],b[maxn];
/* int cmp(const node &a, const node &b) //按l從小到大排序,當l相同時按r從大到小排序
{
if(a.l != b.l) return a.l < b.l;
else return a.r > b.r;
} */
int main()
{
int n, L, i;
cin >> n >> L;//n爲守衛個數,L爲長度
for (i = 0; i < n; i++) {
cin >> a[i].l >> a[i].r;
}
sort(a, a + n);
//sort(a,a+n,cmp);
int flag, pos;
int start = 0, k = 0, l = 0;
for (;;) {
if (l > L) break;
flag = 0;
start = 0;
for (i = 0; i < n; i++) {
if (a[i].l <= l && a[i].r > l)
{
pos = i; //標記包含區間的位置
start = a[i].r; //更改起點
flag = 1;
}
}
if (flag)
{
l = start;//重置起點
b[k] = a[pos];//保存有效區間
k++;
}
else
break;
}
if (flag)
cout << k << endl;
else
cout << -1 << endl;
system("pause");
return 0;
}