pekempeyのブログ

競技プログラミングに関する話題を書いていきます。

Codeforces Round #373 (Div. 1) A. Efim and Strange Grade

A 問題に面倒な実装を持ってくるのやめて欲しい…。

http://codeforces.com/contest/718/problem/A

問題概要

小数点以下のすきな場所で四捨五入するという操作を t 回まで行えるので、操作によって得られる最大の値を求めよ。

解法

いくつか注意点。

  • 入力の小数点はかならずあることが保証されている。
  • 整数部は四捨五入はできない。
  • 答えが整数になる場合は小数点を出力しない。
  • 入力の末尾は 0 でないことが保証されている。

なるべく上位の桁を大きくしたいので、左から右に見ていって 5 以上の値が見つかったらそれを四捨五入すればいい。

たどえば 1.145678 だったら 5 を四捨五入する。1.15 になるのでもう一回四捨五入する。1.2 になるが、これ以上四捨五入する必要はないので操作を終了する。

とまあ解法は単純だが、実装はなかなか面倒。

注意したいケースは 0.5, 5.5, 999.9 とか。

自分はインクリメントした後の正規化関数を頑張って作って、それをメインのコードで使った。バグらせずに書くのはなかなか難しい…。

小数点の文字列処理、最近いくつか出題されてたけど面倒なだけなのでやめて欲しい…。