三個農民每天清晨 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輸出樣例1:300 1000
700 1200
1500 2100
在這裡給出相應的輸出。例如:
900 300輸入樣例2:
10輸出樣例2:2 34 5
6 78 9
10 11
12 13
14 15
16 17
18 19
1 20
19 0輸入樣例3:
3輸出樣例3:100 102
64100 64102
128100 128102
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 秒停止 從開始 到 完全結束,這一期間,至少存在一名農夫正在 的...