题目:http://poj.org/problem?id=2376
题意:就是 N 个区间, 输入 N 个区间的 [begin, end],求能用它们覆盖区间[1,T]的最小组合。
题解:
1. 首先对所有奶牛的排序,按照开始时间升序排序。
2. 更新 起点 为 上一次的终点 + 1,并寻找覆盖起点,且终点最远的区间
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 25000 + 50;
typedef long long LL;
int N;
LL T;
struct Works {
int start,
end;
Works(int s = 0, int e = 0) : start(s), end(e) {}
} works[maxn];
bool cmp(const Works& a, const Works& b)
{
return a.start < b.start || (a.start == b.start && a.end > b.end);
}
void solve()
{
cin >> N >> T;
for (int i = 0; i < N; i++)
{
scanf("%d%d", &works[i].start, &works[i].end);
}
sort(works, works + N, cmp);
int ans = 0;
int current_sum = 0;
bool flag = true;
while (current_sum < T)
{
int begin = current_sum + 1;
for (int i = 0; i < N; i++)
{
//寻找能够能覆盖起点的牛
if (works[i].start <= begin) {
//是否能覆盖起点
if (works[i].end >= begin) {
//寻找 最远的 终点
current_sum = max(current_sum, works[i].end);
}
}
}
//没有找到这样的牛
if (begin > current_sum) {
flag = false;
break;
}
else {
ans++;
}
}
if (flag) {
printf("%d\n", ans);
} else {
printf("-1\n");
}
}
int main()
{
solve();
return 0;
}