結果
| 問題 | No.507 ゲーム大会(チーム決め) | 
| コンテスト | |
| ユーザー |  norioc | 
| 提出日時 | 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));
}
            
            
            
        