okinawa

IT勉強メモ

AtCoder Beginner Contest 301

記念すべき初rated参加。

コンテスト参加は2回めだけど前回はDDos攻撃でunratedになった。

atcoder.jp

A - Overall Winner

・改善点

過半数勝利を先にどっちがするか判定 ⇨ 同点なら先に過半数取ったほうが勝利としているが、そもそも過半数勝利を先にした時点で勝利確定。

過半数勝った時点でbreakしてしまえばよかった。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String s = sc.next();

        int t = 0;
        int a = 0;
        boolean firstT = false;
        boolean firstA = false;
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == 'T') {
                t++;
                if(s.length() /2 <= t && firstT == false && firstA == false) { //⇐ここで過半数勝利を先にどっちがするか判定
                    firstT = true;
                }
            }
            
            if(s.charAt(i) == 'A' ) {
                a++;
                if(s.length() /2 <= a && firstT == false && firstA == false) {
                    firstA = true;
                }
            }
        }
        if(t > a) {
            System.out.println("T");
            return;
        } else if(t == a) {
            if(firstT) {
                System.out.println("T");
            } else {
                System.out.println("A");
            }
        }else {
            System.out.println("A");
        }
    }
}

B - Fill the Gaps

かなり時間がかかったところ。

list.add(i+1+j, list.get(i)+1+j); の部分で何を足して何を引くかこんがらがってしまった。

メモ書きしながら考えを整理しよう。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        List<Integer> list = new ArrayList<>();
        
        for(int i = 0; i < n; i++) {
            list.add(sc.nextInt());
        }
        
        for(int i = 0; i < list.size()-1; i++) {
            if(Math.abs(list.get(i) - list.get(i+1)) != 1) {
                int num = list.get(i) - list.get(i+1);
                if(num < 0) {
                    // プラス方向
                    for(int j = 0; j < Math.abs(num)-1; j++) {
                        list.add(i+1+j, list.get(i)+1+j); //⇐ここで時間かかった。
                    }
//                 i = 0;
                    
                } else {
                    // マイナス方向  
                    for(int j = 0; j < Math.abs(num)-1; j++) {
                        list.add(i+1+j, list.get(i)-1-j); //⇐ここも
                    }
//                 i = 0;
                }
            }
        }
        String s = "";
        for(int nn : list) {
            s += nn + " "; 
            
        }
        System.out.println(s.trim());
    }
}

参考解答

・引用元
Submission #41350087 - パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)

上位の方の解答コード。

すごくシンプルできれいなコードで感動した。

こういうコードを書けるようになりたいなあ。

何でもかんでもfor文で書いてしまうので、while文もうまく使いたい。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            int n = scanner.nextInt();
            int from = scanner.nextInt();
            n--;
            System.out.print(from);
            for (int i=0;i<n;i++) {
                int to = scanner.nextInt();
                while (from != to) {
                    if (from > to)
                        from--;
                    else
                        from++;
                    System.out.print(" "+from);
                }
            }
            System.out.println();
        }
    }

}

C - AtCoder Cards

バケット法。

結構早く解けて満足。

ただ、小文字の a がint数値で何になるかわざわざググってしまったが、 int a = (int) ('a'); で変換してしまえばもっと早かった。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        String t = sc.next();
        int[] arr = new int[27];
        int[] arr2 = new int[27];

        char[] sarr = s.toCharArray();
        char[] tarr = t.toCharArray();

        for (char c : sarr) {
            if (c == '@') {
                arr[26]++;
            } else {
                arr[c - 97]++;
            }
        }

        for (char c : tarr) {
            if (c == '@') {
                arr2[26]++;
            } else {
                arr2[c - 97]++;
            }
        }

        int count = 0;
        int atcount = 0;
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                atcount = arr[i] + arr2[i];

            } else {
                int diff = Math.abs(arr[i] - arr2[i]);
                if (diff > 0 && i != 0 && i != 19 && i != 2 && i != 14 && i != 3 && i != 4 && i != 17) {
                    System.out.println("No");
                    return;
                }
                count += diff;
            }
        }
        if (atcount >= count) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }

    }
}