結果
問題 | No.507 ゲーム大会(チーム決め) |
ユーザー |
![]() |
提出日時 | 2019-12-28 00:08:28 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,959 bytes |
コンパイル時間 | 177 ms |
コンパイル使用メモリ | 82,188 KB |
実行使用メモリ | 134,940 KB |
最終ジャッジ日時 | 2024-10-09 17:43:55 |
合計ジャッジ時間 | 4,715 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 16 RE * 3 |
ソースコード
import sys# 入力を受け取るinput = sys.stdin.readlineN, M = map(int, input().split())As = []for i in range(N):As.append(int(input()))K = As[0]As = As[1:]As.sort()if N == 2*M:print(As[0])#### 二分探索 O(logN) ###### ソート済み配列sorted_arrの中にTrueとFalseの境界が存在## すべてTrue または すべてFalseもありうるdef binary_search(sorted_arr, type="max"):# 境目のうちTrue側のindexを返す。すべてTrueまたはFalseのときは-1を返す# 加えてindex=0の真偽値を返す# ref : 条件式に用いるための変数def binary_TF(sorted_arr, index):# 条件を設定する# 対象となる配列、基準となる配列要素(真ん中)、条件判定に使う基準K_pair = K + sorted_arr[index]As_after = As[0:index] + As[index+1:]Ps = []for i in range(M):pair_tmp = As_after[-1 - i] + As_after[-2*M + i]Ps.append(pair_tmp)if min(Ps) <= K_pair:return Trueelse:return False# 配列の一番最初と最後の要素がそれぞれ条件を満たすかどうかTF_left = binary_TF(sorted_arr, 0)TF_right = binary_TF(sorted_arr, len(sorted_arr)-1)if TF_left == TF_right:# 両方が条件を満たす(または両方が条件を満たさない)場合は終了# 2番目の返り値に、両方の値(TrueかFalse)が入るif TF_left == True:if type == "max":return len(sorted_arr)-1, Trueelif type == "min":return 0, Trueelse:return None, Falseelse:if TF_right:# 最後の要素がTrueの場合、ok = len(sorted_arr) # 末尾側をTrueにし、ng = -1 # 先頭側をFalseにするelse:# 最初の要素がTrueの場合、ok = -1 # 先頭側をTrueにし、ng = len(sorted_arr) # 末尾側をFalseにするwhile (abs(ok - ng) > 1): # 境目が確定するまで繰り返すmid = int((ok + ng)/2)if binary_TF(sorted_arr, mid):ok = midelse:ng = mid# ok : 境目のうち、True側の配列インデックス# 2番目の引数は途中終了の場合との整合性をとるため。return ok, Trueimport pdb# pdb.set_trace()# K君を除いたスコアの最大値と最小値の範囲で二分探索するans = binary_search(As, type="min")[0]if ans == None:print(-1)else:print(As[ans])# ある相方のスコアに対して、# そのスコアを抜いた残りのスコア配列の中から# 大きい順に2M個の数字を取り出す# 取り出した2M個の数字群に対して、# (1番大きい数字+1番小さい数字)+(2番目に大きい数字+2番目に小さい数字)+・・・# を求めて、それぞれP1, P2, ... とする# K君と相方のスコア合計値がPiの最小値よりも大きければOK