山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

Codeforces Round #502 (Div.1, Div. 2) に参加した感想

問題

codeforces.com

コンテストの途中でトラブルなどがあったので、unratedなコンテストとなりました。

結果はB問題まで解くことができました。初めてコンテスト中にB問題を解くことができたので、進歩だと思います。

A. The Rank

f:id:yamakasa3:20180809130929p:plain

ソート問題です。1行目にSmith君のテストの得点が与えられるので、その総得点が全体で何位となるかを答える問題です。ただし、点数が同じ場合はid順となりますが、Smith君のidは1なので考える必要はありません。

考え方

全員の総得点を降順に並べて、Smith君の点数と同じ配列の要素番号を出力すれば良いです。

と、考えたんですが、この問題ではソートする必要はありません。Smith君より点数の大きい人をカウントすれば大丈夫です。

B. The Bits

f:id:yamakasa3:20180809134327p:plain

ビット単位ORに関する問題です。ビットを入れ替えてORを取ったときに、元のORと値が変わる入れ替えのパターンを数え上げる問題です。

考え方

各bitのパターンは、(0, 0)、(1, 1)、(0, 1)、(1, 0) の4通りしかないので、これらの数を数えます。そして、どのパターンとの交換でORの値が変わるかを考えます。

コード

import java.util.Scanner;

public class ProblemB {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        String a = scan.next();
        String b = scan.next();
        long []k = new long[4];
        for(int i = 0; i < n; i++) {
            char c1 = a.charAt(i);
            char c2 = b.charAt(i);
            if(c1 == c2) {
                if(c1 == '0') {
                    k[0]++;
                }else {
                    k[1]++;
                }
            }else {
                if(c1 == '0') {
                    k[2]++;
                }else {
                    k[3]++;
                }
            }
        }
        long ans = k[0] * (k[1] + k[3]) + k[2] * k[3];
        System.out.println(ans);
        scan.close();
    }
}

感想

初めてB問題を解くことができてうれしかったです。途中でunratedとなってしまいましたが、僕のレートは下がる一方なので良かったのかな?

次もB問題を解けるように頑張ります。