AtCoder振り返り:163

AtCoder Beginner Contest 163に参加してきました。
が、
以下のTweetにある通り「Unrated」となりました。

Unratedとは

英単語としては、「未評価」の意味を指します。
つまりこのコンテストを最後までクリアしたとしてもレーティングに反映されないという意味です。
一応問題は回答できるため、気軽に受けられるテスト程度に思ってよいかもしれません。

今回の原因

以下Tweetにある通り、サーバ負荷が原因のようです。
コロナで参加者が増えていますが、その程度で落ちてしまうほど脆弱とは思えません。
何らか原因はあるのでしょうが、次回は同じ問題が起きないことを祈ります。



問題

とはいえ途中までは問題回答したのでその分は振り返ります。
今回も3完でした。(というよりも、Unrated情報が出た時点で4問目以降に挑戦することをやめました。)

問題1

atcoder.jp

半径Rが引数として渡されるので、その円周を求めます。
小学生の時に習った公式が分かっていれば簡単に解けますが円の面積の求め方と間違えないようにしましょう。
■円周の計算式
直径(半径 + 半径) × π

■円の面積の計算式
半径 × 半径 × π

回答コード

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		try (Scanner scn = new Scanner(System.in)) {
			double R = scn.nextDouble();
 
			System.out.println((R+R)*Math.PI);
		}
	}
}

今回はjavaの標準ライブラリを利用してpiを計算しましたが、
解説を見たところ実は定数3.14でも問題なかったです。(浮動小数点の許容が大きいため)

問題2

atcoder.jp

以下の情報が渡されるので、宿題を全て片付けた時何日遊べるかを求める問題です。
引数N・・・夏休み期間
引数M・・・宿題の数
Ai...AM・・・宿題の個数と、それぞれ宿題を片付けるのにかかる日数

回答コード

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		try (Scanner scn = new Scanner(System.in)) {
			int N = scn.nextInt();
			int M = scn.nextInt();
			int[] Ai = new int[M];
 
			int sum = 0;
			for(int i = 0; i < M; i++) {
				Ai[i] = scn.nextInt();
				sum = sum + Ai[i];
			}
 
			if(N < sum) {
				System.out.println(-1);
			}else {
				System.out.println(N-sum);
			}
		}
	}
}

問題3

atcoder.jp

以下の情報をもとに、各社員毎の上司の数を求めます。
引数N・・・社員数
A2...AN・・・各社員の上司の社員番号

あまり難しくないですね。A配列の情報はポインタとして利用することで簡単に求められます。

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		try (Scanner scn = new Scanner(System.in)) {
			int N = scn.nextInt();
			int[] Ai = new int[N];
			int[] Sumi = new int[N];
 
			int sum = 0;
			for(int i = 1; i < N; i++) {
				Ai[i] = scn.nextInt();
			}
 
 
			for(int i = 1; i < N; i++) {
				Sumi[Ai[i]-1]++;
			}
 
 
			for(int i = 0; i < N; i++) {
				System.out.println(Sumi[i]);
			}
		}
	}
}

問題4

atcoder.jp

問題を見る限り組み合わせの問題のようですね。
10^100と混乱させるような書き方をしていますが、正直これは無視していい情報です。
解説でも無視してよいと記載がありますね。

コードは自力ではないですが、以下の参考コードでACできます。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        main.solve();
    }
 
    public void solve() {
        Scanner scan = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        int N = scan.nextInt();
        int K = scan.nextInt();
        long mod = 1000000007;
        long ans = 0;
        int[] d = new int[N+1];
        for (int i = 0; i <= N; i++) {
            d[i] = i;
        }
        long[] s = new long[N+2];
        for (int i = 1; i <= N+1; i++) {
            s[i] += s[i-1] + d[i-1];
            s[i] %= mod;
        }
        for (int i = K; i <= N+1; i++) {
            ans += count(N, i, s, mod);
            ans %= mod;
        }
        System.out.println(ans);
    }
    long count(int N, int K, long[] s, long mod) {
        long min = s[K]+mod-s[0];
        min %= mod;
        long max = s[N+1]+mod-s[N+1-K];
        max %= mod;
        long t = max + mod - min;
        t %= mod;
        t += 1;
        t %= mod;
        return t;
    }
}
|<<

参考