區域覆蓋,數軸覆蓋

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