7 5 1 2 1 擠牛奶 80分

2021-10-07 15:33:46 字數 4034 閱讀 2609

三個農民每天清晨 5 點起床,然後去牛棚給 3 頭牛**.第乙個農民在 300 時刻(從 5 點開始計時, 秒為單位)給他的牛**,一直到 1000 時刻.第二個農民在 700 時刻開始,在 1200 時刻結束.第三個 農民在 1500 時刻開始 2100 時刻結束.期間最長的至少有乙個農民在**的連續時間為 900 秒(從 300 時刻到 1200 時刻),而最長的無人**的連續時間(從**開始一直到**結束)為 300 秒(從 1200 時刻到 1500 時刻).

你的任務是編乙個程式,讀入乙個有 n 個農民(1 <= n <= 5000)擠 n 頭牛的工作時間列表,計算以下兩點(均以秒為單位):

• 長至少有一人在**的時間段.

• 長的無人**的時間段.

輸入格式:

line 1: 乙個整數 n.

lines 2…n+1: 每行兩個小於 1000000 的非負整數,表示乙個農民的開始時刻與結束時刻.

輸出格式:

一行,兩個整數,即題目所要求的兩個答案.

輸入樣例1:

在這裡給出一組輸入。例如:

3

300 1000

700 1200

1500 2100

輸出樣例1:

在這裡給出相應的輸出。例如:

900 300

輸入樣例2:

10

2 34 5

6 78 9

10 11

12 13

14 15

16 17

18 19

1 20

輸出樣例2:

19 0

輸入樣例3:

3

100 102

64100 64102

128100 128102

輸出樣例3:

2 63998

【第一次**】

#include

#include

#include

using

namespace std;

intmain()

set<

int>

s_start

(start.

begin()

, start.

end())

;// 利用集合去重並排序

start.

assign

(s_start.

begin()

, s_start.

end())

; set<

int>

s_end

(end.

begin()

, end.

end())

; end.

assign

(s_end.

begin()

, s_end.

end())

;int big_length_people = end[0]

- start[0]

;// 最長有人**段;

int big_length_no_people =0;

// 最長無人**段;

int length_people = end[0]

- start[0]

;// 有人**的長度;

int length_no_people =0;

// 無人**的長度;

for(

int i =

1; i < n; i++

) length_people = end[i]

- start[i];}

else

if(start[i -1]

> start[i]

)// 當前農民起始時刻位於上乙個農民起始時刻之前

length_people = end[i]

- start[i];}

elseif(

(start[i]

> end[i-1]

))// 當前農民的起始時刻位於上乙個農民的結束時刻後,即產生不連續段

if(length_people > big_length_people)

// 更新最長有人**段

if(length_no_people > big_length_no_people)

//更新最長無人**段

} cout << big_length_people <<

" "<< big_length_no_people << endl;

return0;

}

【錯因】

這裡雖然用到集合set去重並排序,但沒有考慮到開始時刻與結束時刻的對應關係,導致去重並排序時破壞了時刻的對應關係。

【改進】

使用容器map是個好想法:

(1)map的鍵值對是一一對應關係,和開始時刻與結束時刻的一一對應關係相同,可把「開始時刻」作「key」,「結束時刻」作「value」,保護了一一對應關係;

(2)且map的鍵是唯一的,相同的「開始時刻」即相同的「key」只保留乙個,而把對應的最大的「結束時刻」作為「value」保留,可以達到去重效果;

(3)還有map自動根據「key」的大小進行排序,可以達到對「開始時刻」進行排序效果;

【源**】

#include

#include

#include

using

namespace std;

intmain()

else

// 若當前的「start」存在map中的key中,則比較當前「end」與「map[start]」的大小,取兩者較大的作為結束時刻存入map中,保證連續時刻的長度最大;}}

int s = m.

size()

;//獲取字典的大小:有幾個元素;

vector<

int>

start

(s);

vector<

int>

end(s)

; map<

int,

int>

::iterator iter;

// 前向迭代器

int i =0;

for(iter = m.

begin()

; iter != m.

end(

); iter++

)// 將key和value分別按順序存入兩個陣列中,保證一一對應關係;

int imax_pe = end[0]

- start[0]

;// 最長有人**段;

int imax_no =0;

// 最長無人**段;

int l_pe = end[0]

- start[0]

;// 有人**的長度;

int l_no =0;

// 無人**的長度;

for(i =

1; i < s; i++

) l_pe = end[i]

- start[i];}

else

if(start[i]

> end[i-1]

)if(l_pe > imax_pe)

// 更新最長有人**段

if(l_no > imax_no)

//更新最長無人**段

Milking Cows 擠牛奶 (貪心)

1.2.1 milking cows 擠牛奶 time limit 1 sec memory limit 64 mb submit 314 solved 66 submit status discuss description 三個農民每天清晨5點起床,然後去牛棚給3頭牛擠奶。第乙個農民在300時刻...

擠牛奶洛谷uasco

題目描述 三個農民每天清晨5點起床,然後去牛棚給3頭牛 第乙個農民在300秒 從5點開始計時 給他的牛 一直到1000秒。第二個農民在700秒開始,在 1200秒結束。第三個農民在1500秒開始2100秒結束。期間最長的至少有乙個農民在 的連續時間為900秒 從300秒到1200秒 而最長的無人 的...

擠牛奶 校門外的樹

農夫去牛場給奶牛們 現在從 5 點開始按秒計時,第一名農夫在第 300 秒開始給牛 並在第 10001000 秒停止 第二名農夫在第 700 秒開始給牛 並在第 1200 秒停止 第三名農夫在第 1500 秒開始給牛 並在第 2100 秒停止 從開始 到 完全結束,這一期間,至少存在一名農夫正在 的...