POJ 2376 Cleaning Shifts(區間貪心之區間覆蓋)
Description
有一些奶牛,每隻奶牛負責一個時間段。問覆蓋完全部的時間段最少需要多少隻奶牛。若不能全部覆蓋,輸出-1
Input
第一行為兩個整數N和T表示奶牛數量和總時間,之後N行每行兩個整數表示該頭奶牛負責的時間段
Output
若能覆蓋完全部的時間段輸出最少奶牛數量,若不能全部覆蓋,輸出-1
Sample Input
3 10
1 7
3 6
6 10
Sample Output
2
Solution
區間覆蓋貪心。設T
為當前所有已確定區間的最右端,那我們可以每次都取所有可選的小區間(左端點<=T+1
)中右端點最大的值,然後更新最右端點ans++
,初始時t=0
。而由於如果有解t的值是遞增的,那每次選區的區間的左端點也必然是遞增的,所以先排序然後掃描 。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 25555;
struct Cow
{
int start, end;
bool operator<(const Cow &t) const
{
//開始時間從小到大
if (start != t.start)
return start < t.start;
//結束時間從大到小
return end > t.end;
}
} cow[maxn];
int main()
{
// freopen("in.txt", "r", stdin);
int N, T;
while (~scanf("%d%d", &N, &T))
{
for (int i = 0; i < N; i++)
scanf("%d%d", &cow[i].start, &cow[i].end);
sort(cow, cow + N);
int last_y = 0, ans = 0, i = 0;
while (last_y < T && i < N)
{
ans++;
int tmp_y = last_y;
if (cow[i].start > last_y + 1) //中途缺失,無法全部覆蓋。
break;
while (cow[i].start <= last_y + 1 && i < N) //在可選區間內選取右端點最大值
{
tmp_y = max(tmp_y, cow[i].end);
i++;
}
last_y = tmp_y; //更新最右端點
}
if (last_y >= T)
printf("%d\n", ans);
else
printf("-1\n");
}
return 0;
}
參考https://blog.csdn.net/V5ZSQ/article/details/46828461
相關文章
- 貪心演算法之無重疊區間演算法
- 區間問題的貪心方法
- 貪心演算法篇——區間問題演算法
- 貪心演算法-找不重疊的區間段演算法
- 力扣 leetcode 435. 無重疊區間 貪心力扣LeetCode
- POJ1390 Blocks (區間DP)BloC
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- lc 763.劃分字母區間(字串,雙指標)【***貪心演算法】字串指標演算法
- 【貪心】POJ 3617:Best Cow Line
- 使用貪心演算法解決集合覆蓋問題演算法
- POJ 3468 A Simple Problem with Integers (線段樹 區間共加)
- PHPUNIT MOCK設定時間 expectation 覆蓋PHPMock
- POJ2253 Frogger【並查集+貪心】並查集
- POJ 2528 Mayor's posters (線段樹 區間更新+離散化)
- 區間dp
- POJ1797 Heavy Transportation【並查集+貪心】並查集
- 敏捷和 Scrum 之間的區別敏捷Scrum
- select、poll、epoll之間的區別
- querySelector和getElementById之間的區別
- Oracle與OpenJDK之間的區別OracleJDK
- @Bean和@Component之間的區別?Bean
- GCD與NSOperation之間的區別GC
- 【LeetCode貪心#09】用最少數量的箭引爆氣球,(涉及區間重疊情況判斷)LeetCode
- POJ3468 A Simple Problem with Integers---樹狀陣列(區間問題)陣列
- 區間縮小
- 區間合併
- 合併區間
- return,continue和break之間的區別
- JavaSE、JavaEE、JavaME之間的區別概述Java
- MVC,MVP和MVVM之間的區別MVCMVPMVVM
- hadoop發行版本之間的區別Hadoop
- 芻議線段樹 2 (區間修改,區間查詢)
- 樹狀陣列的區間查詢與區間修改陣列
- 車間無線覆蓋計劃的效果如何?
- 如何滿足商業區的無線覆蓋
- 如何滿足商業區的無線覆蓋?
- Sunscreen POJ - 3614(防曬油) 貪心-優先佇列佇列
- poj--3264Balanced Lineup+ST演算法求區間最大最小值演算法