結果
| 問題 | 
                            No.334 門松ゲーム
                             | 
                    
| コンテスト | |
| ユーザー | 
                             izuru_matsuura
                         | 
                    
| 提出日時 | 2016-02-11 21:52:28 | 
| 言語 | D  (dmd 2.109.1)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 2 ms / 2,000 ms | 
| コード長 | 2,089 bytes | 
| コンパイル時間 | 2,547 ms | 
| コンパイル使用メモリ | 197,904 KB | 
| 実行使用メモリ | 6,944 KB | 
| 最終ジャッジ日時 | 2024-06-12 02:50:55 | 
| 合計ジャッジ時間 | 3,351 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge3 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 13 | 
ソースコード
import std.stdio;
import std.ascii;
import std.range;
import std.array;
import std.functional;
import std.algorithm;
import std.conv;
import std.container;
import std.math;
import std.numeric;
import std.string;
import std.random;
import std.regex;
import std.typecons;
void main() {
    int N; scanf("%d\n", &N);
    int[] K = readln.chomp.split(" ").map!(to!int).array;
    bool kadomatsu(int a, int b, int c) {
        if (a < b && b < c) return false;
        if (c < b && b < a) return false;
        if (a == b || b == c || c == a) return false;
        return true;
    }
    
    const int INF = 1001;
    bool win(bool[] used) {
        for (int i = 0; i < N; i++) {
            if (used[i]) continue;
            for (int j = i + 1; j < N; j++) {
                if (used[j]) continue;
                for (int k = j + 1; k < N; k++) {
                    if (used[k]) continue;
                    int x = K[i],
                        y = K[j],
                        z = K[k];
                    if (kadomatsu(x, y, z)) {
                        bool[] n = used.dup;
                        n[i] = n[j] = n[k] = true;
                        bool opp = win(n);
                        if (!opp) {
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }
    bool solve() {
        for (int i = 0; i < N; i++) {
            for (int j = i + 1; j < N; j++) {
                for (int k = j + 1; k < N; k++) {
                    int x = K[i],
                    y = K[j],
                    z = K[k];
                    if (kadomatsu(x, y, z)) {
                        auto used = new bool[N];
                        used[i] = used[j] = used[k] = true;
                        if (!win(used)) {
                            writefln("%(%s %)", [i, j, k]);
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }
    if (!solve()) {
        writeln(-1);
    }
}
            
            
            
        
            
izuru_matsuura