1. 程式人生 > >POJ 2376 淺談一類區間覆蓋問題的貪心解法

POJ 2376 淺談一類區間覆蓋問題的貪心解法

這裡寫圖片描述
世界真的很大
曾經有過那麼一段時間,我是研究過這個問題的
今天在做一道其他題的時候,這個問題作為一個子問題出現了,然後,然後,然後我蒙了你知道吧?
基本上搞忘了,模模糊糊有一點有點印象
趕緊的做一道水題複習一下
立個flag我不會搞忘

看題先:

description

farmer John要安排他的牛清理牛棚,一共有T個牛棚要清理,每頭牛可以清理相鄰的牛棚。比如,一頭牛可以清理4-7號牛棚。當然了,牛清理的牛棚可以重疊。現在要你求出可以完成牛棚的清理的最少頭牛的個數,不可以就輸出-1.

input

  • Line 1: Two space-separated integers: N and T
  • Lines 2..N+1: Each line contains the start and end times of the interval during which a cow can work. A cow starts work at the start time and finishes after the end time.

output

  • Line 1: The minimum number of cows Farmer John needs to hire or -1 if it is not possible to assign a cow to each shift.

這道題是裸的區間覆蓋貪心
方法是,先把所有區間按照L排序,然後挨著挨著選,每次選左區間在已覆蓋範圍內,右區間儘量大的
為什麼這樣是對的,嗯。。。。。顯然?
可以看一下這篇部落格
主要是複習一下結論性的東西和“板子”

完整程式碼:

#include<stdio.h>
#include<algorithm>
using namespace std;

struct speech
{
    int lf,rg;
}sph[100010];

int n,m,ans=0;

bool cmp(const speech &a,const speech &b)
{
    if
(a.lf==b.lf) return a.rg>b.rg; return a.lf<b.lf; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&sph[i].lf,&sph[i].rg); sort(sph+1,sph+n+1,cmp); int k=0,rg=0; while(rg<m) { int now=rg,cnt=0; while(k<=n && sph[k].lf<=rg+1) now=max(now,sph[k].rg),k++,cnt++; if(!cnt) break ; rg=now,ans++; } if(rg==m) printf("%d\n",ans); else printf("-1\n"); return 0; } /* EL PSY CONGROO */

嗯,就是這樣