poj 3190 優先佇列 貪心

2021-07-03 08:02:04 字數 1656 閱讀 9030

題意:

有n頭牛,分別給他們擠奶的時間。

然後每頭牛擠奶的時候都要在乙個stall裡面,並且每個stall每次只能占用一頭牛。

問最少需要多少個stall,並輸出每頭牛所在的stall。

e.g 樣例:

input:

5

1 10

2 43 6

5 84 7

output:

412

324

hint:

explanation of the sample:

here's a graphical schedule for this output:

time     1  2  3  4  5  6  7  8  9 10

stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>

stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..

stall 3 .. .. c3>>>>>>>>> .. .. .. ..

stall 4 .. .. .. c5>>>>>>>>> .. .. ..

other outputs using the same number of stalls are possible.

解析:先將這些時間按照起始時間從小到大排序,然後用優先佇列建立乙個終止時間從小到大的堆。

每次比較堆頂,即終止時間最小的時間,與當前點起始時間的大小。

若小,則將當前這只牛加入到豪華午餐中。。。加入到堆頂這只牛的stall中。

若大,則自己另起爐灶,建立stall。

**:

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define lson lo, mi, rt << 1

#define rson mi + 1, hi, rt << 1 | 1

using namespace std;

const int maxn = 5e4 + 10;

const int inf = 0x3f3f3f3f;

const double eps = 1e-8;

const double pi = acos(-1.0);

const double ee = exp(1.0);

struct node

} cow[maxn];

int stall[maxn];

bool cmp(node a, node b)

int main()

sort(cow, cow + n, cmp);///按照起點排序

priority_queueq;///按照終點建堆

q.push(cow[0]);

int cnt = 1;

stall[cow[0].id] = 1;

for (int i = 1; i < n; i++)

else

}printf("%d\n", cnt);

for (int i = 0; i < n; i++)

}return 0;

}

poj3190區間類貪心 優先佇列

題意 每個奶牛產奶的時間為a到b,每個奶牛產奶時要占用一間房子,問n頭奶牛產奶共需要多少房子,並輸出每頭奶牛用哪間房子 分析 這題就是乙個裸的貪心,將奶牛按開始時間進行排序即可,但考慮一下資料範圍,我們可以用乙個優先佇列來進行維護,在優先佇列中我們按照奶牛的結束時間最小構造小頂堆,然後判斷新進來的元...

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