有n頭牛(1<=n<=50,000)要**。給定每頭牛**的時間區間a,b。牛需要呆在畜欄裡才能**。乙個畜欄同一時間只能容納一頭牛。問至少需要多少個畜欄,才能完成全部**工作,以及每頭牛都放哪個畜欄裡?注意:在同乙個畜欄的兩頭牛,它們**時間區間不能在端點重合。
輸入格式:
第1行:乙個正整數n;
第2…n+1行:第i+1行的兩個整數給出第i頭奶牛的**時間。
輸出格式:
第1行:需要畜欄的最小數;
第2…n+1行:第i+1行表示第i頭奶牛被分配到的畜欄序號
輸入樣例:
51 10
2 43 6
5 84 7
輸出樣例:41
2324
用優先佇列存放已經分配的畜欄,並使得結束時間最早的畜欄始終 位於佇列頭部
#include #include #include #include using namespace std;
struct cow
} cows[50100];
int pos[50100]; // pos[i]表示編號為i的奶牛去的畜欄編號
struct stall
stall (int e, int n) : end(e), no(n) {}
};int main()
sort(cows, cows+n);
int total = 0;
priority_queuepq;
for (int i = 0; i < n; i++) else else }}
printf("%d\n", total);
for (int i = 0; i < n; i++)
return 0;
}
貪心演算法 NC50439 優先佇列 貪心
link 在乙個遊戲中,需要在n個士兵中選出一些士兵組成乙個團,第i個士兵的戰力為v i 團的戰力是團內所有士兵的戰力之和。但是這些士兵有特殊的要求 如果選了第i個士兵,這個士兵希望團的人數不超過s i 如果不選第i個士兵,就沒有這個限制。問團的戰力最大為多少。資料範圍 n 1 n 1 05,1 v...
合併果子(貪心演算法,優先佇列解決)
題目描述 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n 1 次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併...
分配畜欄問題(貪心演算法和優先佇列)
思路如下 先對所有奶牛開始時間排序 然後新開闢乙個畜欄 再怎麼樣至少也有乙個畜欄 每乙個畜欄就是乙個優先佇列,按照結束時間 會場安排 看電影的道理 從小到大排序 判斷奶牛屬於哪乙個畜欄就是看這個奶牛的開始時間與前幾個已經開闢完的畜欄的結束時間比,如果開始時間比結束時間段早,那就再分配新畜欄。如下 i...