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開始 思路 目標明確,求最少用多少奶槽,並輸出如何分配,明顯區間貪心,找貪心的方向,就是對時間的最末端進行貪心。簡單來說,先把奶牛們的時間輸入並按開始時間進行排序,然後依次把有序的時間段都放入...