有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對數,讓每對數的差的平方的和最大值為乙個貪心模型,我們只需要將集合中的元素按從小到大排...