小q在進行一場競技遊戲,這場遊戲的勝負關鍵就在於能否能爭奪一條長度為l的河道,即可以看作是[0,l]的一條數軸。
這款競技遊戲當中有n個可以提供視野的道具−真視守衛,第i個真視守衛能夠覆蓋區間[xi,yi]。現在小q想知道至少用幾個真視守衛就可以覆蓋整段河道。
輸入描述:
輸入包括n+1行。
第一行包括兩個正整數n和l(1<=n<=105,1<=l<=109)
接下來的n行,每行兩個正整數xi,yi(0<=xi<=yi<=109),表示第i個真視守衛覆蓋的區間。
輸出描述:
乙個整數,表示最少需要的真視守衛數量, 如果無解, 輸出-1。
輸入例子1:
4 63 6
2 40 2
4 7輸出例子1:
(這道題自己踩雷了,還有乙個無解的情況,題目說輸出-1,讀題仔細很重要)
演算法思路
(1)首先要對所有守衛(x,y)根據x排序,對於最新選出的[xi, yi]最大延伸長度為yi;
(2)選出守衛的x小於xi的守衛,遍歷查詢哪個y延伸的最遠
(3)得到新的[xj, yj]和最大延伸長度yj,返回(1)
題目要求的輸入格式
a =
list((
map(
lambda x:
int(x)
,input()
.split())
))n, l = a[0]
,a[1
]eyes =
for i in
range
(n):
list((
map(
lambda x:
int(x)
,input()
.split()))))
模擬乙個輸入
n=
11l=
28eyes =[[
0,3]
,[5,
24],[
8,27]
,[9,
19],[
3,17]
,[13,
18],[
9,25]
,[19,
29],[
12,15]
,[25,
29],[
0,6]
]
eyes.sort(
)end =
0max_length =
0time =
1#需要的守衛,剛開始就要有乙個
for i in
range
(n):
if max_length>=l:
break
#長度達到退出
if eyes[i][0
]>end:
#如果中間空開了,比如【0,6】和【8,27】那麼說明中間必有乙個
time +=
1#守衛數量+1
end = max_length
max_length =
max(eyes[i][1
], max_length)
#***
elif eyes[i][1
]>max_length:
#如果和前乙個仍然是重疊關係,且延伸長度更長,更新最大延伸長度
max_length = eyes[i][1
]print
(time)
eyes.sort(
)def
eye_search
(eye_y,eye_list)
: length =
[i[1
]-eye_y for i in eye_list if i[0]
<=eye_y]
; turn =
len(length)
choose = eye_list[length.index(
max(length))]
#被選中的孩子
return choose[1]
,eye_list[turn:
]eye_y=eyes[0]
[0]eye_list = eyes
eye_time =
0while
len(eye_list)
>
0and eye_y
eye_time +=
1 eye_y, eye_list = eye_search(eye_y=eye_y, eye_list=eye_list)
print
(eye_time)
這道題有無解的情況,輸出的時候要注意,這裡就不寫了,溜了。 python 2020演算法筆試題目 逛街
小q在週末的時候和他的小夥伴來到大城市逛街,一條步行街上有很多高樓,共有n座高樓排成一行。小q從第一棟一直走到了最後一棟,小q從來都沒有見到這麼多的樓,所以他想知道他在每棟樓的位置處能看到多少棟樓呢?當前面的樓的高度大於等於後面的樓時,後面的樓將被擋住 輸入描述 輸入第一行將包含乙個數字n,代表樓的...
python 2020微光 筆試01 分辨復讀機
知識點與收穫 成電微光工作室2020筆試第一題,下一屆想進入微光工作室的成電小夥伴可以來康康。題目給出這樣一段txt檔案 a 小夥子最近怎麼樣 b 最近在參加微光工作室的招新 a 感覺怎樣 b 感覺好多題有點難 a 那咋辦嘛 b 那咋辦嘛 a 那咋辦嘛 b 那咋辦嘛 a 那咋辦嘛 b 那我能咋辦嘛 ...
筆試題 2020華為筆試
i j k p,0測試用例 120,3 12,1 題目描述 乙個矩陣,5 5,取相鄰 二個成員有乙個邊是相同的 的6個,輸入乙個6個成員列表,判斷是否滿足?矩陣成員如下 1,2,3,4,5 11,12,13,14,15 21,22,23,24,25 31,32,33,34,35 41,42,43,4...