貪心 Ybt 畜欄預定

2021-10-13 18:33:38 字數 1553 閱讀 6681

同一時間內,乙個畜欄只能供一頭牛使用。給出一些牛需要使用畜欄的時間段,讓你求使用的最少畜欄數量與安排方案。

輸入第一行乙個 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對每頭牛的開...