4144 畜欄保留問題 貪心 優先佇列

2021-10-18 18:03:16 字數 2970 閱讀 8563

總時間限制: 1000ms 記憶體限制: 65536kb

農場有n頭牛,每頭牛會在乙個特定的時間區間[a, b](包括a和b)在畜欄裡**,且乙個畜欄裡同時只能有一頭牛在**。現在農場主希望知道最少幾個畜欄能滿足上述要求,並要求給出每頭牛被安排的方案。對於多種可行方案,主要輸出一種即可。

輸入的第一行包含乙個整數n(1 ≤ n ≤ 50, 000),表示有n牛頭;接下來n行每行包含兩個數,分別表示這頭牛的**時間[ai, bi](1 ≤ a≤ b ≤ 1, 000, 000)。

輸出的第一行包含乙個整數,表示最少需要的畜欄數;接下來n行,第i+1行描述了第i頭牛所被分配的畜欄編號(從1開始)。

51 10

2 43 6

5 84 741

2324

最大限度利用已有的畜欄。

把n頭牛按照開始時間排序;

為第1頭牛新建乙個畜欄,記錄其結束時間;

對於第i頭牛,找到已有的畜欄中結束時間最早的,並與它自己的開始時間比較。

如果開始時間大於(注意這裡是嚴格大於,之前自以為是大於等於然後一直wa嚶嚶嚶┭┮﹏┭┮)最早的結束時間,就把牛i安排到那個畜欄裡面,把原來的牛j「丟出來」;如果小於等於,就新建乙個畜欄。更新結束時間。

假設用以上貪心策略對前n頭牛的安排方案至少和最優策略用的畜欄數相同,並且該方案具有最小的最早結束時間。

當n=1時,結論顯然成立;

假設當n=k時也成立,那麼對於k+1頭牛:

① 證明貪心策略對前n頭牛的安排方案至少和最優策略用的畜欄數相同:

(反證法)若畜欄數不是最優的,已知k頭牛的最優策略的畜欄數就是上述貪心策略得到的,那麼前k+1頭牛的最優策略不會小於這個數;

又因為結論不成立,所以一定是——

貪心策略:放入第k+1頭牛的時候,它的開始時間ak+1小於前k頭牛貪心策略得到的最早結束時間tk,新建了乙個畜欄;

最優策略:放入第k+1頭牛的時候,它的開始時間大於等於前k頭牛最優策略得到的最早結束時間t』k,放入了已有的畜欄;

也就是t』k

<=ak+1

按照開始時間排序所有的牛;

用優先佇列維護已有畜欄,保證堆頂的畜欄具有最小的最早結束時間;

對於一頭新的牛,要麼把原有的牛彈出,再放入自己(相當於更新了原有的畜欄的狀態),要麼直接放入自己(相當於新建了乙個畜欄)。

注意此時的運算子過載在結構體內部

#include

#include

#include

#include

using

namespace std;

#define maxn 50010

struct cattle//定義結構體,l,r分別表示牛**的開始、結束時間,id表示第i頭牛};

priority_queue q;

//建立優先佇列

cattle a[maxn]

;//儲存每一頭牛的資訊

int use[maxn]

;//儲存每一頭牛被放入的畜欄編號

bool

mycmp

(cattle a, cattle b)

//自定義排序,按照開始時間從小到大

主函式:

int

main()

sort

(a, a + n, mycmp)

;//把n頭牛按照開始時間從小到大進行排序

for(

int i =

0; i < n; i++

)else

q.push

(a[i]);

//把牛i放到原佇列裡面

} cout << ans << endl;

for(

int i =

0; i < n; i++

) cout << use[i]

<< endl;

return0;

}

優先佇列

基本概念

可以按照自定義的方式(資料的優先順序)對佇列中的資料動態排序

每次pop,push操作,佇列都會根據優先順序動態調整優先順序

預設使用《來確定資料之間的優先順序關係

也可以由使用者自定義

自定義的方式有兩種:1. 不需要結構體(如下);2.在結構體內嵌運算子過載

priority_queue,less>s;//定義優先順序佇列s,less表示按照遞減(從大到小)的順序插入元素 priority_queue,greater>s;//定義優先順序佇列s,greater表示按照遞增(從小到大)的順序插入元素 priority_queuep;//直接定義,預設為順序遞減基本操作:

empty(); 隊列為空返回1

pop(); 出隊

push(); 入隊

top(); 返回佇列中優先順序最高的元素

size(); 返回佇列中元素的個數

基於多關鍵字的結構體比較

4. 內嵌運算子過載

決定了優先佇列中的「優先順序」規則

struct cattle//定義結構體,l,r分別表示牛**的開始、結束時間,id表示第i頭牛

};

另一種定義方式

struct node

int priority;

int value;

};

外接比較函式

比如傳參到sort()函式裡面使用

bool

mycmp

(cattle a, cattle b)

//自定義排序,按照開始時間從小到大

sort

(a, a + n, mycmp)

;//把n頭牛按照開始時間從小到大進行排序

蕪湖~第一篇題解寫完啦!

貪心演算法 畜欄保留問題(poj3190 )

總時間限制 1000ms 記憶體限制 65536kb 描述 農場有 n頭牛,每頭牛會在乙個特定的時間區間 a,b 包括a和b 在畜欄裡擠奶,且乙個畜欄裡同時只能有一頭牛在擠奶。現在農場主希望知道最少幾個畜欄能滿足上述要求,並要求給出每頭牛被安排的方案。對於多種可行方案,主要輸出一種即可。輸入輸入的第...

畜欄問題(貪心策略)

題目內容 有n頭牛 1 n 50,000 要 給定每頭牛 的時間區間 a,b 1 a b 1,000,000,a,b為整數 牛需要呆在畜欄裡才能 乙個畜欄同一時間只能容納一頭牛。問至少需要多少個畜欄,才能完成全部 工作,以及每頭牛都放哪個畜欄裡?注意 在同乙個畜欄的兩頭牛,它們 時間區間不能在端點重...

分配畜欄問題(貪心演算法和優先佇列)

思路如下 先對所有奶牛開始時間排序 然後新開闢乙個畜欄 再怎麼樣至少也有乙個畜欄 每乙個畜欄就是乙個優先佇列,按照結束時間 會場安排 看電影的道理 從小到大排序 判斷奶牛屬於哪乙個畜欄就是看這個奶牛的開始時間與前幾個已經開闢完的畜欄的結束時間比,如果開始時間比結束時間段早,那就再分配新畜欄。如下 i...