1. 程式人生 > >poj 2376(區間覆蓋)

poj 2376(區間覆蓋)

題目大意:有若干頭牛,每一頭牛都有自己的工作時間段(稱為小區間),現有一個給定的總工作時間段(稱為大區間),要求用最小的小區間數來覆蓋大區間並輸出區間數

分析:該問題的原型就是區間覆蓋問題,首先要對輸入的資料進行排序,排序的標準是:每個區間的開始時間升序,然後開始處理資料,每次都貪心的選取最長的時間段即可,

           最後要判斷最後加入的那個區間的結束時間是否大於或等於大區間的結束時間。

**********

注意!覆蓋大區間的每個小區間不一定要有重疊部分,只要連線就可以了!(就因為沒考慮到這個。。。。。WA了好久。。。)

**********

ac程式碼

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

const int M = 25000 + 5;

struct cow
{
	int start;
	int end;
}a[M];

bool cmp(const cow &A, const cow &B)
{
	return A.start < B.start;
}

int main()
{
	int N, T;
	scanf("%d %d", &N, &T);
	for(int i = 0; i < N; i++)
		scanf("%d %d", &a[i].start, &a[i].end);
	sort(a, a + N, cmp);
	a[N].start = 0x7fffffff;
	/*for(int i = 0; i < N; i++)
		printf("%d %d\n", a[i].start, a[i].end);*/
	int begin = 0, finish = 0, ans = 0, flag = 0;
	for(int i = 0; i < N; i++)
	{
		if(a[i].start <= begin + 1)
		{
			if(a[i].end > finish)
			{
				finish = a[i].end;
				flag = 1;
			}
			if(a[i + 1].start > begin + 1 && flag)
			{
				begin = finish;
				flag = 0;
				ans++;
			}
		}	
	}
	if(finish < T)printf("-1\n");
	else printf("%d\n", ans);
	return 0;
}