小明發現**的自動對局系統在匹配對手時,只會將積分差恰好是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 ...