Submission #5440077


Source Code Expand

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

#define REP(i,n) for(int i=0;i<n;i++)
typedef long long int lli;
typedef pair<int, int> P;


// dp[i][j]: ai、bj まで使った状態での価値の最大値
//lli dp[1001][1001];
int main() {
    int A, B;
    cin >> A >> B;
    lli a[A];
    lli b[B];
    REP(i, A) {
        cin >> a[i];
    }
    REP(i, B) {
        cin >> b[i];
    }

    lli ans = 1;
    int a_count = 0;
    int b_count = 0;
    lli score = 0;
    lli b_score = 0;
    bool my_turn = true;
    for(int i=1;i<=A+B;i++) {
        if (a_count == A) {
            // a は存在しない => b をとる
            if (my_turn) {
                score += b[b_count];
            }
            b_count++;
        }
        else if (b_count == B) {
            // b は存在しない => a をとる
            if (my_turn) {
                score += a[a_count];
            }
            a_count++;
        }
        else {
            // a も b も残っている => 計算
            lli a_next=0;
            lli b_next=0;
            if (a_count+1 < A)
                a_next = a[a_count+1];
            if (b_count+1 < B)
                b_next = b[b_count+1];

            lli a_benefit = a[a_count] - max(a_next, b[b_count]);
            lli b_benefit = b[b_count] - max(b_next, a[a_count]);

            if (a_benefit > b_benefit) {
                if (my_turn)
                    score += a[a_count];
                a_count++;
            }
            else {
                if (my_turn)
                    score += b[b_count];
                b_count++;
            }
        }
        //cout << score << endl;
        my_turn = !my_turn;
    }

    //for(int i=0;i<=A;i++) {
    //    for (int j=0; j<=B; j++) {
    //        // 相手のターン
    //        if ((i + j) % 2 == 1) {
    //            // a を使う
    //            if (i < A)
    //                dp[i+1][j] = dp[i][j];
    //            // b を使う
    //            if (j < B)
    //                dp[i][j+1] = dp[i][j];
    //        }
    //        else {
    //            // a を使う
    //            if (i < A)
    //                dp[i+1][j] = max(dp[i+1][j], dp[i][j] + a[i]);
    //            // b を使う
    //            if (j < B)
    //                dp[i][j+1] = max(dp[i][j+1], dp[i][j] + b[j]);
    //            //if (i == 0 && j == 1) {
    //            //    cout << "dp["<<i<<"]["<<j<<"]: " << dp[i][j]<<endl;
    //            //    cout << "dp["<<i<<"]["<<j+1<<"]: " << dp[i][j+1]<<endl;
    //            //    cout << "dp["<<i+1<<"]["<<j<<"]: " << dp[i+1][j]<<endl;
    //            //}
    //        }
    //    }
    //}

    //for(int i=0;i<=A;i++) {
    //    for (int j=0; j<=B; j++) {
    //        cout << "dp["<<i<<"]["<<j<<"]: " << dp[i][j]<<endl;
    //    }
    //}


    cout << score << endl;
}

Submission Info

Submission Time
Task B - ゲーム
User longtime
Language C++14 (GCC 5.4.1)
Score 0
Code Size 2965 Byte
Status WA
Exec Time 2 ms
Memory 256 KB

Judge Result

Set Name All
Score / Max Score 0 / 3
Status
AC × 3
WA × 2
Set Name Test Cases
All 00, 01, 02, 90, 91
Case Name Status Exec Time Memory
00 AC 1 ms 256 KB
01 WA 1 ms 256 KB
02 WA 2 ms 256 KB
90 AC 1 ms 256 KB
91 AC 1 ms 256 KB