0w1

台北市104 學年度資訊學科能力競賽 pC. Underdog ( 田忌賽馬 )

f:id:h0rnet:20161018230920j:plain
暴力判斷就可以了。
顯然把最強的K + 1個依序跟對手最弱的K + 1個比,一定最優。

#include <bits/stdc++.h>
using namespace std;

typedef vector< int > vi;
typedef vector< vi > vvi;
typedef pair< int, int > pii;
typedef vector< pii > vp;

int K, N;
vi S; // team id to rank
vi rS; // rank to team id
vvi P, U, L;

void init(){
    cin >> K >> N;
    S = rS = vi( N );
    P = U = L = vvi( N, vi( 2 * K + 1 ) );
    for( int i = 0; i < N; ++i ){
        cin >> S[ i ],
        --S[ i ],
        rS[ S[ i ] ] = i;
        for( int j = 0; j < 2 * K + 1; ++j )
            cin >> P[ i ][ j ];
        for( int j = 0; j < 2 * K + 1; ++j )
            cin >> U[ i ][ j ];
        for( int j = 0; j < 2 * K + 1; ++j )
            cin >> L[ i ][ j ];
    }
}

int win( vi a, vi b, int rank_a, int rank_b ){
    for( int i = 0; i < a.size() / 2; ++i )
        a.insert( a.begin(), a.back() ),
        a.pop_back();
    int win_cnt = 0;
    for( int i = 0; i < a.size(); ++i )
        if( a[ i ] > b[ i ] or ( a[ i ] == b[ i ] and rank_a < rank_b ) )
            ++win_cnt;
    return win_cnt >= K + 1;
}

void solve(){
    for( int i = N - 1; i >= 0; --i ){
        int win_all = 1;
        for( int j = 0; j < N; ++j )
            if( rS[ i ] != j )
                if( not win( P[ rS[ i ] ], P[ j ], i, S[ j ] ) ){
                    win_all = 0;
                    break;
                }
        if( win_all ){
            cout << rS[ i ] + 1 << " ";
            break;
        }
    }
    for( int i = N - 1; i >= 0; --i ){
        int win_all = 1;
        for( int j = 0; j < N; ++j )
            if( rS[ i ] != j )
                if( not win( U[ rS[ i ] ], L[ j ], i, S[ j ] ) ){
                    win_all = 0;
                    break;
                }
        if( win_all ){
            cout << rS[ i ] + 1 << endl;
            break;
        }
    }
}

signed main(){
    ios::sync_with_stdio( false );
    init();
    solve();
    return 0;
}