題解 AcWing 111 畜欄預定

2022-07-06 13:54:12 字數 1453 閱讀 9107

有n頭牛在畜欄中吃草。

每個畜欄在同一時間段只能提供給一頭牛吃草,所以可能會需要多個畜欄。

給定n頭牛和每頭牛開始吃草的時間a以及結束吃草的時間b,每頭牛在[a,b]這一時間段內都會一直吃草。

當兩頭牛的吃草區間存在交集時(包括端點),這兩頭牛不能被安排在同乙個畜欄吃草。

求需要的最小畜欄數目和每頭牛對應的畜欄方案。

輸入格式
第1行:輸入乙個整數n。

第2..n+1行:第i+1行輸入第i頭牛的開始吃草時間a以及結束吃草時間b,數之間用空格隔開。

輸出格式
第1行:輸入乙個整數,代表所需最小畜欄數。

第2..n+1行:第i+1行輸入第i頭牛被安排到的畜欄編號,編號是從1開始的 連續 整數,只要方案合法即可。

資料範圍

\(1≤n≤50000,\)

\(1≤a,b≤1000000\)

輸入樣例:

5

1 10

2 43 6

5 84 7

輸出樣例:
412

324

時間複雜度

\(o(nlogn)\)

做法將所有牛所佔區間按左端點排序

將牛放入畜欄

1.能放入,就放入

2.不能放入,建新畜欄

證明我不大會證明,嚴謹的證明看y總吧qwq

實現用乙個結構體存下牛的區間編號

用乙個小根堆來維護所有畜欄的最右端畜欄編號

注意結構體需要存下牛的編號!!!

如果沒有存下編號,排序之後 i 便不是代表牛的編號了

牛的編號就消失(打亂)了

那時候本人一度搞不懂自己**錯了

ac **

#include #include #include #include #include #include using namespace std;

typedef pairpii;

const int n = 5e4 + 10;

int n;

int id[n];

priority_queue , greater> heap;

struct rec

} seg[n];

int main()

sort(seg, seg + n);

int res = 0;

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

else );}

}printf("%d\n", heap.size());

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

printf("%d\n", id[i]);

return 0;

}

AcWing 111 畜欄預定

很明顯的貪心 就是讓乙個柵欄盡可能多的放牛 按左端點排序,即每頭牛開始吃草的時間 維護最後一頭牛的吃草結束的時間 如果當前的牛可以跟他拼柵欄,那就拼,否則新開乙個柵欄 詳細看 注釋 include define a 50010 define pi pair define fi first defin...

acwing111 畜欄預定 排序,貪心,模擬

有n頭牛在畜欄中吃草。每個畜欄在同一時間段只能提供給一頭牛吃草,所以可能會需要多個畜欄。給定n頭牛和每頭牛開始吃草的時間a以及結束吃草的時間b,每頭牛在 a,b 這一時間段內都會一直吃草。當兩頭牛的吃草區間存在交集時 包括端點 這兩頭牛不能被安排在同乙個畜欄吃草。求需要的最小畜欄數目和每頭牛對應的畜...

ACwing 天才ACM 題解

題面入口 題目大意,將乙個數列劃分成最少的幾段,滿足每段內的資料集合中,取m對最大最小數出來,將其取出來的每對數求差值並平方,並求這m對的差值平方的求和值s,這個值不能超過指定的t。題目分析 從劃分後的集合中選出m對數,讓每對數的差的平方的和最大值為乙個貪心模型,我們只需要將集合中的元素按從小到大排...