- https://atcoder.jp/contests/abc330/tasks/abc330_c
- この問題を解いていて、誤差が怖いのでlong doubleを使った
- floatやdoubleを使っても通るか確認したところ通ったが、実行時間に差があった
実行時間 long double 122ms float 12ms double 8ms
int main(){ cin.tie(0); ios::sync_with_stdio(false); // input ll D;cin>>D; ld d = sqrtl(D); ll mi=inf; rep(x,1e7){ if(x>=d)break; ld y = sqrtl(D-x*x); ll y0 = floorl(y); ll y1 = ceill(y); ll v0 = abs(x*x + y0*y0 - D); chmin(mi,v0); ll v1 = abs(x*x + y1*y1 - D); chmin(mi,v1); } p(mi); return 0; }
- 122msはlong doubleのsqrtを106回程度回した時の時間なので、1回当たりは十分に速い
- とはいえ、AHCの焼きなましで可能な限り回したい(高速化したい)などの時は、doubleに落とすのは全然ありだろう