pyてよn日記

一寸先は闇が人生

ABC026: B - N重丸

問題

ABC026: B - N重丸

自分の考察

 まず,面積の求め方はどうするのか考えたが,サンプルにそれは書いてあった.問題自体は簡単であるが,この問題のポイントは計算の精度である.出力する際の精度に気をつける必要があり,自分はそれで 2,3 回 WA をくらってしまった.

 WA の原因はおそらく計算精度だろうとは勘付き,ローカルでの表示と AtCoder のコードテストでサンプルを実行してみたところ, std::cout の出力の精度が合っていないということが分かった.問題の条件には「 答えは、相対誤差または絶対誤差が  10^{-6} 以下であれば許容される」とあったが,コードテストでは小数点第 4 位で四捨五入された数値が出力されていたのである.これが WA の原因だった(e.g.) 3.141592が欲しいところを3.1416と出力してしまう).

 これを解決するには,std::coutの出力の精度を変える必要があった.下記の記事を見ながら,標準ライブラリ <iomanip>std::setprecision を用いて出力の精度をうまく調節して無事 AC となった.

marycore.jp

解法

 特に難しいことはない.最後の出力に精度が必要になるため,std::setprecisionを用いている,という点だけは注意.必要な精度は,「整数部分の最大桁数 + 小数点以下に必要な精度分の桁数」であるため,この問題では,整数部分  1000^{2} = 10^{6} (与えられる半径の最大値)より  6 桁,小数点以下に必要な精度  10^{-6} より 6+1 桁分を出力するように指定した.こうしておけば,計算結果が大きな値になっても小数点部分の精度は保たれる.AC したコードは以下.

ABC026: B - N重丸

気づき

  • 小数点以下の精度が必要な計算には数値型に double を用いる.

  • 環境により標準出力のされ方が違うため,精度が求められる問題ではコードテストで確認をしてみた方が良い.WA でペナルティをくらうよりは時間は無駄にならない.

類題

atcoder.jp

参考