Submission #654273


Source Code Expand


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 *
 * @author Jeera
 */
//public class Dowango_2015_D_problem1 {
public class Main {

    /**
     * 問題文  http://dwango2015-honsen.contest.atcoder.jp/tasks/dwango2015_finals_4
     */
    
        /**/
        static int coin_max  ;
        static int coin[] ;
        static int value[]  ;
        static int Q_max ;
        static int Q[][]  ;
        /**/
        static int H = 0 ; // head:表 = Niwango
        static int T = 1 ; // tail:裏 = Nikomoba
        static int score_Niwango = 0 ;
        static int score_Nikomoba = 0 ;
        
        static int memo[][] ;

    public static void main(String[] args) throws IOException {
        // 
        // データの読み込み
        String str = "";
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        
        str = r.readLine() ; //入力した文字列をstrに代入
        if (str == null) return; // ideoneの入力エラー対策
        if (str.length() <= 0)  return;
        
        String str1[] = str.split(" ");
        coin_max = Integer.parseInt(str1[0]);
        
        coin  = new int[coin_max] ;
        value = new int[coin_max] ;
        Q = new int[2][coin_max] ;
        
        str = r.readLine(); //入力した文字列をstrに代入
        if (str == null) return; // ideoneの入力エラー対策
        if (str.length() <= 0)  return;
        str1 = str.split(" ");
        for (int i = 0 ; i < coin_max; i++) {
            value[i] = Integer.parseInt(str1[i]) ;
        }
        
        str = r.readLine(); //入力した文字列をstrに代入
        if (str == null) return; // ideoneの入力エラー対策
        if (str.length() <= 0)  return;
        str1 = str.split(" ");
        Q_max = Integer.parseInt(str1[0]);
        
        for (int i = 0 ; i < coin_max; i++) {
            str = r.readLine(); //入力した文字列をstrに代入
            if (str == null) return; // ideoneの入力エラー対策
            if (str.length() <= 0)  return;
            str1 = str.split(" ");
            Q[i][0] = Integer.parseInt(str1[0]);
            Q[i][1] = Integer.parseInt(str1[1]) ;
        }
                
        // Original game
        play_onegame() ;
        //   
        
        for (int j=0 ; j < Q_max; j++) {
            int Qi = Q[j][0] - 1; // Qiは、n番目なので補正が必要
            int Di = Q[j][1] ;
//            System.out.printf("Qi= %d, Di= %d \n",Qi+1,Di) ;
            value[Qi] = value[Qi] - Di ;
            //
            play_onegame() ;
            //   
            //value[Qi] = value[Qi] + Di ;  // これが問題として分かりにくい
        }
        
//        System.out.printf("*** END *** \n") ;
        
    }
    static void play_onegame() {
            //
            score_Niwango = 0 ;
            score_Nikomoba = 0 ;
            for (int i = 0 ; i < coin_max ; i++) {
                coin[i] = i % 2 ;
            }
            memo =  new int[2][coin_max] ;
            for (int k = 0 ; k < coin_max; k++) {
                memo[H][k] = -1 ;
                memo[T][k] = -1 ;                     
            }
            
            score_Niwango = search(coin, 0 ) ;
            // 
            System.out.printf("%d\n", score_Niwango) ;
            //System.out.printf("Niwango's score is = %d \n\n", score_Niwango) ;
            //   
        
    }
    
    static int search(int[] coin0, int n ) {
        int Hand ;
        int Aite ;
        int coin1[] = new int[coin_max] ;
        
        Hand = n % 2;
        Aite = (n + 1) % 2;

        if (memo[coin0[n]][n]>0) return memo[coin0[n]][n] ;
        
        System.arraycopy(coin0, 0, coin1, 0, coin_max);
        
        
        int score0, score1, score2 ; // 何もしない、Nを裏返す、N+1を裏返す
        
        if ((n + 2) == coin_max) {
            //  自、他(終) =>  自、自  
            if ((coin1[n] == Hand) & (coin1[n + 1] == Aite)) {
                coin1[n + 1] = Hand;
                if (Hand == H) {
                    return (value[n] + value[n + 1]);
                } else {
                    return 0;
                }
            }
            //  他、自(終) =>  自、自  
            if ((coin1[n] == Aite) & (coin1[n + 1] == Hand)) {
                coin1[n] = Hand;
                if (Hand == H) {
                    return (value[n] + value[n + 1]);
                } else {
                    return 0;
                }
            }
            // 自、自のケースは何もしない
            //  他、他のケース
            if ((coin1[n] == Aite) & (coin1[n + 1] == Aite)) {
                //  他、他(終) => (大きい方) 
                if (value[n] > value[n + 1]) {
                    coin1[n] = Hand;
                    if (Hand == H) {
                        return value[n];
                    } else {
                        return value[n + 1];
                    }
                } else {
                    coin1[n + 1] = Hand;
                    if (Hand == H) {
                        return value[n + 1];
                    } else {
                        return value[n];
                    }
                }
            }
        }
        
        // 何もしない場合 (自、他)
        int score = search(coin1, n+1) ;
        if (coin1[n]==H) score0 = score + value[n] ; else score0 = score ;
        // Nを裏返す場合 (coin[n]==Aite --> Hand)
        if (Hand == H) score1 = score + value[n] ; else score1 = score ;
        // N+1を裏返す場合 (coin[n+1]は常にAite --> Hand)
            coin1[n+1]=Hand;// Nを裏返す
            score2 = search(coin1, n+1) ;
            if (coin1[n] == H) score2 = value[n] + score2 ;
            coin1[n+1]=Aite; // Nを裏返す(元に戻す)
    /**/    
        int max_value  ;
        int min_value  ;
        max_value = max(score0, score1, score2) ;
        min_value = min(score0, score1, score2) ;
        
        if (Hand == H) {
            if (memo[H][n]== -1) memo[H][n] = max_value ;
            if (memo[H][n] < max_value) memo[H][n] = max_value ;
        } else {
            if (memo[T][n]== -1) memo[T][n] = min_value ;
            if (memo[T][n] > min_value) memo[T][n] = min_value ;           
        }
        
        if (Hand == H) return max_value ;
        else return min_value ;
    
    }
    static int max(int a, int b, int c) {
        if ((a>b) & (a>c)) return a ;
        if ((b>a) & (b>c)) return b ;
        else return c ;
    }
    static int min(int a, int b, int c) {
        if ((a<b) & (a<c)) return a ;
        if ((b<a) & (b<c)) return b ;
        else return c ;
    }
    
}

Submission Info

Submission Time
Task D - コインの取り合い
User Cummin
Language Java (OpenJDK 1.7.0)
Score 0
Code Size 7009 Byte
Status WA
Exec Time 941 ms
Memory 54572 KB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3
Score / Max Score 0 / 0 0 / 10 0 / 80 0 / 90
Status
WA × 1
RE × 1
WA × 7
WA × 3
RE × 11
WA × 10
RE × 23
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
Subtask1 subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt
Subtask2 sample_01.txt, sample_02.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt
Subtask3 subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt, subtask3_01.txt, subtask3_02.txt, subtask3_03.txt, subtask3_04.txt, subtask3_05.txt, subtask3_06.txt, subtask3_07.txt, subtask3_08.txt, subtask3_09.txt, subtask3_10.txt, subtask3_11.txt, subtask3_12.txt, subtask3_13.txt, subtask3_14.txt
Case Name Status Exec Time Memory
sample_01.txt WA 297 ms 20648 KB
sample_02.txt RE 295 ms 20752 KB
subtask1_01.txt WA 292 ms 20572 KB
subtask1_02.txt WA 628 ms 53792 KB
subtask1_03.txt WA 613 ms 53548 KB
subtask1_04.txt WA 621 ms 53944 KB
subtask1_05.txt WA 602 ms 50296 KB
subtask1_06.txt WA 530 ms 43360 KB
subtask1_07.txt WA 604 ms 53748 KB
subtask2_01.txt WA 294 ms 20752 KB
subtask2_02.txt RE 478 ms 36148 KB
subtask2_03.txt RE 560 ms 47496 KB
subtask2_04.txt RE 573 ms 47796 KB
subtask2_05.txt RE 564 ms 47472 KB
subtask2_06.txt RE 547 ms 47200 KB
subtask2_07.txt RE 566 ms 47604 KB
subtask2_08.txt WA 548 ms 43416 KB
subtask2_09.txt RE 439 ms 30816 KB
subtask2_10.txt RE 557 ms 47360 KB
subtask2_11.txt RE 553 ms 47200 KB
subtask2_12.txt RE 566 ms 47692 KB
subtask3_01.txt RE 481 ms 36048 KB
subtask3_02.txt RE 633 ms 54012 KB
subtask3_03.txt RE 644 ms 54268 KB
subtask3_04.txt RE 627 ms 50840 KB
subtask3_05.txt WA 566 ms 43348 KB
subtask3_06.txt RE 644 ms 54252 KB
subtask3_07.txt RE 636 ms 54232 KB
subtask3_08.txt RE 647 ms 54264 KB
subtask3_09.txt RE 685 ms 54216 KB
subtask3_10.txt RE 615 ms 52976 KB
subtask3_11.txt RE 564 ms 45236 KB
subtask3_12.txt RE 645 ms 54552 KB
subtask3_13.txt RE 941 ms 54572 KB
subtask3_14.txt RE 622 ms 50856 KB