猫でもわかるWeb開発・プログラミング

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

AtCoder Beginner Contes #026 に参加しました

結果

f:id:yoshiki_utakata:20150711231954p:plain

D問題は答えが複数あるが故、Sample Imput だけでは正解しているかどうか分からず、適当に提出しまくってたら12回も誤答してしまいましたw でも、提出してるうちに分かってきて、最終的には正しい答えに辿りつけました。

A - 掛け算の最大値

x + y = A となる x, y 全ての組に対して x * y を計算して最大値をとるだけでいい

class Main {
    static Scanner sc = new Scanner(new InputStreamReader(System.in));
    public static void main(String[] args) throws Exception {
        int a = sc.nextInt();
        int ans = 0;
        for(int i = 1; i < a; i++) {
            int j = a - i;
            ans = Math.max(ans, i*j);
        }
        System.out.println(ans);
    }
}

実は入力はかならず偶数らしいのでこんなことしなくていい。

B - N重丸

最も大きい円の面積 - 2番目のに大きい円の面積 + 3番目に大きい円の面積 - ...

class Main {
    static Scanner sc = new Scanner(new InputStreamReader(System.in));
    public static void main(String[] args) throws Exception {
        int n = sc.nextInt();
        int[] r = new int[n];
        for (int i = 0; i < n; i++) {
            r[i] = sc.nextInt();
        }
        Arrays.sort(r);
                
        double ans = 0;
        int mult = 1;
        for (int i = n-1; i >= 0; i--) {
            ans += mult * Math.PI * r[i] * r[i];
            mult *= -1;
        }
        System.out.printf("%.8f\n", ans);
    }
}

C - 高橋君の給料

木構造を生成して再帰的に給料を求めていくだけ

解答: http://abc026.contest.atcoder.jp/submissions/444764

D - 高橋君ボール1号

二分探索すればいい。区間 left <= t <= right について考える。center = (left + right) / 2 とする。 f(left)f(center) が100をまたいでいる場合は区間を left <= t <= center に絞る。そうでない場合は center <= t <= right に絞って探索すればいい。f(center) - 100 を調べて差が 0.000001 以下だったら終了。区間は割りと適当に決めてもできる気がするが、最初の center を A * center = 100 となる点として、その前後でsinがπだけ変化する区間にした。

解答: http://abc026.contest.atcoder.jp/submissions/446199

反省

D問題難しく考え過ぎた。