atcoder beginner contest 050 振り返り

# A
## 所要時間
5分
## 方針
空白区切りで各要素を取得して2番目の要素に応じて処理を切り替える
## コード
```java
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String in = scanner.nextLine();
        List<String> list = Arrays.asList(in.split(" "));
        if (list.get(1).equals("+")) {
            System.out.println(Integer.valueOf(list.get(0)) + Integer.valueOf(list.get(2)));
        } else {
            System.out.println(Integer.valueOf(list.get(0)) - Integer.valueOf(list.get(2)));
        }
    }
}
```

# B
## 所要時間
40分
## 方針
TのリストとP,Xをまとめたリストの2つを用意し、P,Xのリストの要素を順々に取り出して合計値に適用する。
## コード
```java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        // N : 問題数
        // T_i : 問題iを解くのにかかる時間
        // M : ドリンク数
        // P_i : 問題i
        // X_i : ブーストされた後の問題回答時間

        Scanner scanner = new Scanner(System.in);
        List<String> ins = new ArrayList<>();
        while (scanner.hasNextLine()) {
            String s = scanner.nextLine();
            if (s.isEmpty()) break;
            ins.add(s);
        }

        List<Integer> T = new ArrayList<>();
        List<String> PX = new ArrayList<>();
        // T
        for (String s : ins.get(1).split(" ")) {
            T.add(Integer.valueOf(s));
        }

        // PX
        for (String s : ins.subList(3, ins.size())) {
            PX.add(s);
        }

        for (String s : PX) {
            List<String> list = Arrays.asList(s.split(" "));
            int P = Integer.valueOf(list.get(0)) - 1;
            int X = Integer.valueOf(list.get(1));
            System.out.println(getTotal(T, P, X));
        }
        
    }

    private static int getTotal(List<Integer> list, int P, int X) {
        int result = 0;
        for (int i=0;i<list.size();i++) {
            result += i == P ? X : list.get(i);
        }
        return result;
    }
}

```
## 感想
計算時間を一定値だけ減らすことが出来るドリンクの成分が気になりすぎる。
それはともかくとして、短縮される問題番号が1からスタートすることを忘れていて時間を食ってしまったので、与えられる値について問題文とよく照らし合わせて条件を掴むようにする。

# C
## 所要時間
55分以上 (途中でタイムオーバー)
## 方針
偶数のとき
- 0 が含まれない
- 要素は必ず奇数である
- 与えられる数字は必ずペア(2個ずつ)である
- 並び方の総数は`2 ^ (与えられた要素数 ÷ 2)` である

奇数のとき
- 0 が1つだけ含まれる
- 要素は必ず偶数である
- 与えられる数字は 0 を除いてすべてペアである
- 並び方の総数は `2 ^ ((与えられた要素数 - 1) ÷ 2)` である

上記の条件に沿う。

並び方の総数は絶対値が同じ数同士の人間の配置は2パターンあることから、`2 ^ (与えられた要素数 ÷ 2)` または `2 ^ ((与えられた要素数 - 1) ÷ 2)` となる。

## コード
(AC 10 /14)
```java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<String> ins = new ArrayList<>();
        while (scanner.hasNextLine()) {
            String s = scanner.nextLine();
            if (s.isEmpty()) break;
            ins.add(s);
        }
        scanner.close();

        int N = Integer.valueOf(ins.get(0));
        if (!(1 <= N && N <= Math.pow(10, 5))) {
            System.out.println(0);
            return;
        }

        Map<String, Integer> map = new HashMap<>();
        boolean isOdd = N % 2 == 1;
        int zero = 0;
        for (String s : ins.get(1).split(" ")) {
            int i = Integer.valueOf(s);
            if ((isOdd && i % 2 == 1) || (!isOdd && i % 2 == 0) || (!isOdd && i == 0)) {
                System.out.println(0);
                return;
            }
            if (!(0 <= i && i <= N-1)) {
                System.out.println(0);
                return;
            }
            if (isOdd && i == 0 && zero == 1) {
                System.out.println(0);
                return;
            }
            if (map.containsKey(s) && i != 0 && map.get(s) == 2) {
                System.out.println(0);
                return;
            }
            if (i == 0) zero++;
            if (map.containsKey(s)) map.put(s, map.get(s) + 1);
            else map.put(s, 1);
        }

        double patterns = Math.pow(2, (N % 2 == 0 ? N : N-1) / 2);
        double devide = Math.pow(10,9) + 7;
        System.out.println((int) (patterns % devide));
    }
}

```
感想：これ以外に条件ありますか?