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

2021-08-11 08:48:44 字數 1305 閱讀 3868

總時間限制: 

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開始)。

樣例輸入

5

1 10

2 43 6

5 84 7

樣例輸出

412

324

這也是乙個貪心的演算法,在我看來貪心演算法,就是平時這麼用平常的思維解決問題,在貪心演算法中,證明貪心演算法我覺得是最難的部分,可是用平時的思維去思考的話,其實,你會發現其實,不用證明好像就是對的;

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

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

3) 依次處理後面每頭奶牛

i。處理

i 時,考慮已分配畜欄中,結束時間最早的畜欄x。

若 e(x) < s(i),

則不用分配新畜欄,

i可進入

x,並修改

e(x)

為e(i)

若 e(x) >= s(i)

,則分配新畜欄

y,記

e(y) = e(i)

直到所有奶牛處理結束

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

位於佇列頭部。

這裡第搜尋畜欄有沒有空的,最好使用stl中的優先佇列,這樣時間複雜度才是nlogn,這樣才能勉強過;

ps:在poj上c++編譯能過,g++不能過;

#include#include using namespace std;

#define num 50005

struct cow

fence(){};

fence(int x,int y,int n):k(x),j(y),no(n){}

};int main()

// for(int i = 0;ipq;

for(int i = 0;i

貪心演算法 求解畜欄問題

題目內容 有n頭牛 1 n 50,000 要 給定每頭牛 的時間區間a,b。牛需要呆在畜欄裡才能 乙個畜欄同一時間只能容納一頭牛。問至少需要多少個畜欄,才能完成全部 工作,注意 在同乙個畜欄的兩頭牛,它們 時間區間不能在端點重合。輸入格式 第1行 乙個正整數n 第2 n 1行 第i 1行的兩個整數給...

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

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

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

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