Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

AtCoder Beginner Contest 169

4完3WA。落ち着け。

各問題

A - Multiplication 1

掛け算を、します。

B - Multiplication 2

まず、0が一つでもあるときは絶対0なので0を出力します。サンプルにもあるで大丈夫でしょう。(優しい・・・)

で、順次掛けていくわけですが、10^18を超えてはいけないのでチェックする必要があります。

ここで、そこまでの積にさらにAを掛けたものでチェックしようとすると、(64ビット整数だと)オーバーフローの可能性があるので、式変形して、例えば10^18 / Aがそこまでの積を超えていないか?のように気を使う必要があります。

一箇所returnを忘れて1WA・・・。方針は間違ってないのにWAをだして、誤差死しちゃった?とテンパってしまいました。

C - Multiplication 3

誤差死しないためにはBを100倍してから答えを100でわります。方針自体はそれで終わりなんですが、単純にB * 100では誤差が出るっぽいので注意が必要です。

自分は2WA出しました・・・。で、開き直って文字列で取って小数点を消しました。(おい(←あ、ちょくだいさんのツイートによれば、別にそれでいいらしいです。

(2020-06-02 追記)

コンテスト後、Pythonだと楽ちんという話が出ていましたが、我らがJavaでもこの程度はBigDecimalを使えば誤差死することなく簡単に計算が可能です。

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        BigDecimal x = new BigDecimal(in.next());
        BigDecimal y = new BigDecimal(in.next());
        System.out.println(x.multiply(y).setScale(0, RoundingMode.DOWN));
    }
}

これからこういう系統の問題が出たら迷わずJavaで解こうかしら?

D - Div Game

Nを素因数分解して、因数毎に使える数を確定してきます。

例えば24なら2^3 * 3^1なのでそこから2^12^23^1が取り出せます。

997764507000の場合は2^3 * 3^3 * 5^3 * 6079^2なので、2^1, 2^2, 3^1, 3^2, 5^1, 5^2, 6079^1の7つが取り出せます。

BとCでちょっとハマったので、今日のオアシス問題でした。

E - Count Median

偶数のときが全然わかりませんでした・・・。奇数のときがあっているのかもまだわかりませんが。

F - Knapsack for All Subsets

見てません。

まとめ

いやー、BとCがひどかった・・・。しかもBは単なるreturn忘れで落としてますけど、問題が問題なのでてっきり何か誤差周りのあれかと思ってそこでテンパってしまいました。

修行が足りません・・・。

結局レートは今日も微増ですか。まあかろうじてだけど水パフォなのでよしということで。

f:id:mdstoy:20200531233011p:plain