結果
問題 | No.507 ゲーム大会(チーム決め) |
ユーザー |
![]() |
提出日時 | 2017-08-19 02:48:38 |
言語 | D (dmd 2.109.1) |
結果 |
AC
|
実行時間 | 48 ms / 3,000 ms |
コード長 | 1,335 bytes |
コンパイル時間 | 978 ms |
コンパイル使用メモリ | 108,536 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-12 21:41:22 |
合計ジャッジ時間 | 1,881 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 19 |
ソースコード
import std.algorithm; import std.array; import std.conv; import std.math; import std.range; import std.stdio; import std.string; import std.typecons; int readint() { return readln.chomp.to!int; } int[] readints() { return readln.split.map!(to!int).array; } bool can(int myScore, int p, int m, int[] xs) { int lt = 0; int rt = cast(int) xs.length - 1; int n = 0; while (lt < rt) { if (lt == p) { lt++; } else if (rt == p) { rt--; } else if (xs[lt] + xs[rt] > myScore) { n++; lt++; rt--; } else { lt++; } } return n < m; } int calc(int a0, int m, int[] xs) { xs.sort; int ans = int.max; int lo = 0; int hi = cast(int) xs.length - 1; while (lo <= hi) { int mid = (lo + hi) / 2; int myScore = a0 + xs[mid]; if (can(myScore, mid, m, xs)) { hi = mid - 1; ans = min(ans, mid); } else { lo = mid + 1; } } return ans == int.max ? -1 : xs[ans]; } void main() { auto nm = readints(); int n = nm[0], m = nm[1]; int a0 = readint(); int[] xs; for (int i = 0; i < n - 1; i++) { xs ~= readint(); } writeln(calc(a0, m, xs)); }