同一時間內,乙個畜欄只能供一頭牛使用。給出一些牛需要使用畜欄的時間段,讓你求使用的最少畜欄數量與安排方案。
輸入第一行乙個 n ,代表牛的數量
接下來 2 ~ n+1 行,每行兩個數,代表這頭牛使用畜欄的起始時間與結束時間。
輸出第一行乙個數,代表最少畜欄數量。
接下來 2 ~ n+1 行,每行乙個數,代表這頭牛安排到第幾個畜欄。
先按開始時間從小到大排序,時間相同的按結束時間從小到大排序。
假設我們已經安排了k頭牛在畜欄內,對於要考慮的下一頭牛:
1.它的開始時間比在畜欄內的牛最早結束時間早
衝突,新建乙個畜欄。
2.它的開始時間比在畜欄內的牛最早結束時間晚
將它安排進已結束使用的畜欄。
在畜欄內的牛最早結束時間可以用堆維護。
#include
#include
#include
#include
#include
using
namespace std;
int n, ans, zz, x, y, ans;
priority_queue int,
int>
, vectorint,
int>
>
, greaterint,
int>
>
> q;
//小根堆
struct asdf a[
50011];
struct sdfg anss[
50011];
bool
cmp(asdf aa, asdf bb)
intmain()
sort
(a+1
, a+
1+n, cmp)
;for
(int i =
1; i <= n;
++i)
//存圍欄用的變數anss
anss[i]
.id = a[i]
.id;
anss[1]
.wl =1;
ans =1;
q.push
(make_pair
(a[1
].right,1)
);//(結束時間,畜欄序號)
for(
int i =
2; i <= n;
++i)
else
}for
(int i =
1; i <= n;
++i)
//還原順序
a[anss[i]
.id]
.left = anss[i]
.wl;
printf
("%d\n"
, ans)
;for
(int i =
1; i <= n;
++i)
printf
("%d\n"
,a[i]
.left)
;return0;
}
畜欄預定(貪心)
有n頭牛在畜欄中吃草。每個畜欄在同一時間段只能提供給一頭牛吃草,所以可能會需要多個畜欄。給定n頭牛和每頭牛開始吃草的時間a以及結束吃草的時間b,每頭牛在 a,b 這一時間段內都會一直吃草。當兩頭牛的吃草區間存在交集時 包括端點 這兩頭牛不能被安排在同乙個畜欄吃草。求需要的最小畜欄數目和每頭牛對應的畜...
ybtoj 貪心 堆 例題3 畜欄預定
傳送門題目 以奶牛開始吃草時間排序 可以發現,只要畜欄的最後一頭奶牛結束吃草時間越早,接上奶牛的可能性就越大 用小根堆,以畜欄的結束吃草時間實時排序 include include include include using namespace std struct dt a 50100 t int...
YbtOJ高效高階 貪心 3 畜欄預定
ybtoj高效高階 貪心 3 有n頭牛在畜欄中吃草。每個畜欄在同一時間段只能提供給一頭牛吃草,所以可能會需要多個畜欄,給出第i頭牛開始吃草的時間區間 ai bi a i,b i ai b i 求需要的最少畜欄數和每頭牛對應的畜欄方案。5 1 10 2 43 6 5 84 7412 324對每頭牛的開...