文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

AtCoder Beginner Contest 121 感想

AtCoder Beginner Contest 121 に参加しました。


順位は悲惨なので書きたくないです。


A - White Cells

atcoder.jp
h行w列を塗りつぶすと、重複して塗られるマスが h*w 個できます。
よって答えは H*W - (h*W+w*H-h*w) です。



B - Can you solve this?

atcoder.jp
やるだけの問題でした。



C - Energy Drink Collector

atcoder.jp


まず、コードを貼ります。

void solve () {

	long n = nextLong(), m = nextLong();
	TreeMap<Long, Long> map = new TreeMap<>();
	for (int i=0; i<n; i++) {
		map.put(nextLong(), nextLong());
	}

	long ans = 0L;
	for (Map.Entry<Long, Long> e: map.entrySet()) {
		if (m <= e.getValue()) {
			ans += e.getKey() * m;
			break;
		}
		else {
			m -= e.getValue();
			ans += e.getKey() * e.getValue();
		}
	}

	out.println(ans);

}


最初提出したときには絶対にACできると思っていました。しかし、何度提出してもWA、WA。


勘違いしました。


このコードだと、例えば 2,10 の直後に 2,1 が来たとき、本来であれば 2,11 と Map に格納しなければいけないところを、2,10 のまま変更されません。致命的ミス。


あれだけ使い勝手が良いと言っていた map.put(a, map.getOrDefault(a,0)+b) のまたとない出番でしょう。何やってるの。

なぜ解けなかったか?

入力例に「A が重複するパターン」がなかったので気が付けなかった……と言い訳したいです。
すべては、入力例と出力例から答えを帰納しようとする自分の悪い癖のせいです。

これから何をすべきか?

入力例と出力例から解答コードを作らない。
少なくとも、最初の提出だけは入力例と出力例を見ずに提出する、など。



総括

特になし、反省せよ。