結果

問題 No.9 モンスターのレベル上げ
ユーザー なおなお
提出日時 2014-10-05 15:59:40
言語 C++11
(gcc 8.4.1)
結果
AC  
実行時間 383 ms / 5,000 ms
コード長 1,542 Byte
コンパイル時間 1,014 ms
使用メモリ 7,024 KB
最終ジャッジ日時 2021-09-12 09:49:10
合計ジャッジ時間 5,043 ms
ジャッジサーバーID
(参考情報)
judge11 / judge15
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
testcase_00 AC 1 ms
4,972 KB
testcase_01 AC 1 ms
4,976 KB
testcase_02 AC 383 ms
4,976 KB
testcase_03 AC 303 ms
4,972 KB
testcase_04 AC 161 ms
4,976 KB
testcase_05 AC 104 ms
4,976 KB
testcase_06 AC 36 ms
7,020 KB
testcase_07 AC 2 ms
7,020 KB
testcase_08 AC 46 ms
7,024 KB
testcase_09 AC 371 ms
4,972 KB
testcase_10 AC 2 ms
4,972 KB
testcase_11 AC 297 ms
4,972 KB
testcase_12 AC 236 ms
7,024 KB
testcase_13 AC 187 ms
4,976 KB
testcase_14 AC 375 ms
7,020 KB
testcase_15 AC 336 ms
4,972 KB
testcase_16 AC 7 ms
4,980 KB
testcase_17 AC 212 ms
4,976 KB
testcase_18 AC 180 ms
4,972 KB
testcase_19 AC 4 ms
4,976 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

#define REP(i, n)           for(int(i)=0;(i)<(n);++(i))
#define mp                  make_pair
int N, A[1501], B[1501];

int solve(){
    priority_queue<pair<int,int> > q0;
    REP(i,N) q0.push(mp(-A[i],0));

    int minv = 1<<29;
    REP(i,N){
        auto q = q0;
        REP(j,N){
            int add = B[(i+j)%N]/2;
            auto a = q.top(); q.pop();
            a.first-=add; a.second--;
            q.push(a);
        }
        int maxv = 0;
        while(q.size()){
            maxv = max(maxv, -q.top().second); q.pop();
        }
        minv = min(minv, maxv);
    }
    return minv;
}

int naive(){
    vector<pair<int,int> > v0,v;
    REP(i,N) v0.push_back(mp(A[i],0));
    sort(v0.begin(), v0.end());

    int minv = 1<<29;
    REP(i,N){
        v = v0;
        REP(j,N){
            int add = B[(i+j)%N]/2;
            v[0].first += add;
            v[0].second++;
            sort(v.begin(), v.end());
        }
        int maxv = 0;
        REP(j,N) maxv = max(maxv, v[j].second);
        //REP(j,N) cerr<<"("<<v[j].first<<","<<v[j].second<<"),"; cerr << endl;
        minv = min(minv, maxv);
    }
    return minv;
}

int main(){
    cin >> N;
    if(N > 1500){ cerr << "error" << endl; return 1; }
    REP(i,N){ cin >> A[i]; if(A[i] > 10000){ cerr << "error" << endl; return 1; } }
    REP(i,N){ cin >> B[i]; if(B[i] > 10000){ cerr << "error" << endl; return 1; } }

    cout << solve() << endl;
//  cout << naive() << endl;
    return 0;
}
0