UnKoder #06 B Impossible Game

2015/05/22 (Fri) hackerrank UnKoder 貪欲

問題

問題文

方針

まずレベルでソートする.除くなら連続する区間の方が良いのでそれを全探索する.

$ x_i \leq x_j $ で $ x_j $ を倒せるなら $ x_i $ も倒せるのでソートして前から見ていく. そのときに,あるタイミングで次に $a_i, a_{i+1}, a_{i+2}$ と並んでいるとき,$a_{i}, a_{i+2} $ を除いてもクリアできるなら, $a_{i}, a_{i+1}$ を除いてもクリア可能で後の勇者のレベルは低くなる.レベルは低くしたいので,このようにしていくと任意のクリア可能な除き方は前に揃っていくはず. ならば最初からそのような区間を探索すれば良い.

実装

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    int N, x;
    cin >> N >> x;
    ll a[55];
    rep(i,N) cin >> a[i];
    sort(a,a+N);
    int ans = 55;
    for(int l=0;l<=N;l++){
        for(int r=l;r<=N;r++){
            ll cur = x;
            bool ok = true;
            rep(i,N){
                if(l<=i && i<r) continue;
                if(cur >= a[i]) cur += a[i];
                else ok = false;
            }
            if(!ok) ans = min<int>(ans, r-l);
        }
    }
    if(ans==55) ans = -1;
    cout << ans << endl;
}