poj 3190 Jack的日常做題記錄

2021-09-24 21:29:07 字數 1567 閱讀 5775

poj3190

題目概述:

有 n頭牛(1<=n<=50,000)要**。給定每頭牛**的時間區

間[a,b] (1<=a<=b<=1,000,000,a,b為整數)。

牛需要呆畜欄裡才能**。乙個畜欄同一時間只能容納一頭牛。

問至少需要多少個畜欄,才能完成全部**工作,以及每頭牛都

放哪個畜欄裡(special judged)

去同乙個畜欄的兩頭牛,它們**時間區間哪怕只在端點重合也是不可以的。

解法思路:

所有奶牛都必須**。到了乙個奶牛的**開始時間,就必須為這個奶

牛找畜欄。因此按照奶牛的開始時間逐個處理它們,是必然的。

s(x)表示奶牛x的開始時間。e(x)表示x的結束時間。對e(x), x可以是奶牛,也可以是畜欄。畜欄的結束時間,就是正在其裡面**的奶牛的結束時間。同乙個畜欄的結束時間是不斷在變的。

把所有奶牛按開始時間從小到大排序。

為第一頭奶牛分配乙個畜欄。

依次處理後面每頭奶牛i。處理 i 時,考慮已分配畜欄中,結束時間最

早的畜欄x。

若 e(x) < s(i), 則不用分配新畜欄,i可進入x,並修改e(x)為e(i)

若 e(x) >= s(i),則分配新畜欄y,記 e(y) = e(i)

直到所有奶牛處理結束

需要用優先佇列存放已經分配的畜欄,並使得結束時間最早的畜欄始終

位於佇列頭部。

證明:由於按開始時間的順序處理奶牛是必然,且按該演算法,為奶牛i分配新

畜欄時,確實是不得不分配的,所以演算法正確。

複雜度: o(nlogn),o(n)用來遍歷奶牛,o(logn)用於給奶牛找畜欄,使用優先佇列達到這種效率,不然會t…

接下來看**吧,qaq。

#include

#include

#include

#include

#include

#include

#include

#include

#define n 50001

using namespace std;

struct cow

}cows[n]

;int pos[n]

,total;

struct stall

bool operator<

(const stall & s)

const};

intmain()

sort

(cows,cows+n)

; priority_queue pq;

for(

int i=

0;i)else

else}}

printf

("%d\n"

,total)

;for

(int i=

0;i)printf

("%d\n"

,pos[i]);

return0;

}

兩個小於號過載,乙個用於sort,乙個用於建立優先佇列。

poj 3190 優先佇列 貪心

題意 有n頭牛,分別給他們擠奶的時間。然後每頭牛擠奶的時候都要在乙個stall裡面,並且每個stall每次只能占用一頭牛。問最少需要多少個stall,並輸出每頭牛所在的stall。e.g 樣例 input 5 1 10 2 43 6 5 84 7 output 412 324 hint explan...

題解 poj3190 貪心 堆優化

題目鏈結 按照開始吃草的時間把牛排序。用乙個小根堆維護每個畜欄最後一頭牛結束吃草的時間,嘗試把當前的牛安排在堆頂 include include include using namespace std define rep i,a,b for int i a i b i const int n 5e...

poj3190 區間貪心 STL

題意 n頭任性的牛,每頭牛都要在自己的時間段裡擠奶,問最少用多少個擠奶槽並輸出每頭牛所在的擠奶槽的編號 從1開始 思路 目標明確,求最少用多少奶槽,並輸出如何分配,明顯區間貪心,找貪心的方向,就是對時間的最末端進行貪心。簡單來說,先把奶牛們的時間輸入並按開始時間進行排序,然後依次把有序的時間段都放入...