對局匹配 python

2021-10-05 09:01:38 字數 1538 閱讀 3002

小明發現**的自動對局系統在匹配對手時,只會將積分差恰好是k的兩名使用者匹配在一起。如果兩人分差小於或大於k,系統都不會將他們匹配。

現在小明知道這個**總共有n名使用者,以及他們的積分分別是a1, a2, … an。

對於30%的資料,1 <= n <= 10

對於100%的資料,1 <= n <= 100000, 0 <= ai <= 100000, 0 <= k <= 100000

輸出格式

乙個整數,代表答案。

樣例輸入

10 0

1 4 2 8 5 7 1 4 2 8

樣例輸出

6

from collections import counter

from heapq import heapify

input_ =

lambda

:map

(int

,input()

.strip(

).split(

' ')

)n,k = input_(

)nums = counter(input_())

if k==0:

print

(len

(nums)

)else

:def

isrt

(n):

global k,dic,nums

temp = n%k

#dic沒有key就新建

if temp not

in dic:

dic[temp]=[

(nums[n]

,n)]

#如果key中滿了就

elif

len(dic[temp])==

3:tm=

[x for x,y in dic[temp]

if y!=n-k]+[

0]heapify(dic[temp]

)#保證第0個是最小的

dic[temp][0

]=(max

(tm)

+nums[n]

,n)else

: tm=

[x for x,y in dic[temp]

if y!=n-k]+[

0]dic[temp]

(max

(tm)

+nums[n]

,n))

#排序 l =

sorted

(nums.keys())

#初始化,dic中記錄 餘數:(個數,最大數)

dic =

for i in l:

isrt(i)

#輸出每個餘數對應的最大個數的和。

print

(sum

(max

(x[0

]for x in y)

for y in dic.values())

)

思路借鑑前人經驗,用餘數劃分。我的改變是為了節約空間,所以記錄3個情況,要麼新建,要麼增加,要麼滿3個每次替換數量最小的。

歷屆試題 對局匹配

這幾天心態有點崩,不會的忒多了,翻翻學長們的部落格,同時期的他們學的演算法比我多,題量也是!而且我很多學的演算法和資料結構都只是做過模板題。md下學期逃課吧,我愛acm!萬幸今天下午查機組考得還算可以hhhh,算是一件值得高興的事呢。如果對於給定的k為0,那麼我們讓每乙個積分為x的組的人數都只剩乙個...

對局匹配 動態規劃

一道動態規劃的題目,不出意外的我又不會做 淚目。下面是我參考別人部落格之後寫出來的 小明發現 的自動對局系統在匹配對手時,只會將積分差恰好是k的兩名使用者匹配在一起。如果兩人分差小於或大於k,系統都不會將他們匹配。現在小明知道這個 總共有n名使用者,以及他們的積分分別是a1,a2,an。對於30 的...

對局匹配(藍橋杯)

小明發現 的自動對局系統在匹配對手時,只會將積分差恰好是k的兩名使用者匹配在一起。如果兩人分差小於或大於k,系統都不會將他們匹配。現在小明知道這個 總共有n名使用者,以及他們的積分分別是a1,a2,an。第一行包含兩個個整數n和k。第二行包含n個整數a1,a2,an。對於30 的資料,1 n 10 ...