每日一題 暴力求解 最大點集合

2021-08-22 16:33:14 字數 1583 閱讀 5266

問題描述:

p為給定的二維平面整數點集。定義 p 中某點x,如果x滿足 p 中任意點都不在 x 的右上方區域內(橫縱座標都大於x),則稱其為「最大的」。求出所有「最大的」點的集合。(所有點的橫座標和縱座標都不重複, 座標軸範圍在[0, 1e9) 內)

如下圖:實心點為滿足條件的點的集合。請實現**找到集合 p 中的所有 」最大「 點的集合並輸出。

輸入描述:

第一行輸入點集的個數 n, 接下來 n 行,每行兩個數字代表點的 x 軸和 y 軸。

對於 50%的資料, 1 <= n <= 10000;

對於 100%的資料, 1 <= n <= 500000;

輸出描述:

輸出「最大的」 點集合, 按照 x 軸從小到大的方式輸出,每行兩個數字分別代表點的 x 軸和 y軸。
示例1

輸入

5 1 2

5 3

4 6

7 5

9 0

輸出

4 6

7 5

9 0

思路:本題通俗的說就是在平面上找點集的右邊和上邊邊界。這裡考慮先找到點集中「最右邊」的點(px,py),那麼其餘邊界點一定存在於這個點的左上方,也就是滿足(x < px 且 y > py),並且邊界點的縱座標從左到右依次下降。(示例圖中紅色點符合這個規律)

對點進行排序,排序之後的點集是按照從左到右,從上到下的順序,那麼最後乙個點就是最右邊的點。記錄邊界點中的最高y值 max_y ,按照排序從後往前遍歷所有點,如果這個點y值比 max_y 要大,那麼這個點一定是邊界點,計入結果集,並更新max_y為當前點y值。

**實現如下:

# 這段**在牛客中ac 80%,判斷超記憶體了

deffindpoints

(): nums = int(input())

points =

result =

for i in range(0, nums):

points.sort()

# 先確定最右邊的點p,其餘的邊界點一定是y>py,xmax_x2y = points[- 1][1]

# 倒著往回找點

for j in range(nums - 2, -1, -1):

if points[j][1] > max_x2y:

max_x2y = points[j][1]

while len(result) > 0:

point = result.pop()

print(point[0], point[1])

每日一題 合併集合

一共有 n 個數,編號是 1 n,最開始每個數各自在乙個集合中。現在要進行 m 個操作,操作共有兩種 m a b,將編號為 a 和 b 的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作 q a b,詢問編號為 a 和 b 的兩個數是否在同乙個集合中 輸入格式 第一行輸入整數 n ...

LeetCode每日一題 集合問題

子集問題,看到這種題,肯定是可以用dfs加遞迴可以做的。首先分析思路,這種類似於全排列的情況,並且順序不同算一種的話,其實就只要遞迴遍歷就可以了 這題其實就是類似於全排列的問題,顯而易見的是順利不同的組合算是乙個,例如 1,2,3 1,3,2 因為陣列中的元素是排序且無重複的,因此只需要考慮在遞迴進...

每日一題 some小問題集合

classa object defshow self print this is the a show classb object defshow self print this is the b show obj b obj.show obj.class a obj.show this is th...