見出し画像

AtCoder Beginner Contest 174を見直す B - Distance

問題

N個の点のX座標、Y座標が与えられるので原点との距離がK以内の点の数を答えよ。ちなみに原点からの距離は(x^2+y^2)^0.5で求められる。

B問題だからか、原点からの距離を求める公式が問題文に含まれていてググらなくて済みました。

当日作成した解答(Python:438ms)

n, d = map(int, input().split())
count = 0
for _ in range(n):
   x, y = map(int, input().split())
   if (x*x + y*y)**0.5 <= d: count += 1
print(count)

ウヒョー、動的型付け言語サイコー!!!

まぁ、ちょっと分かりづらいところもありつつ、このシンプルさは素晴らしい。ルートを(**0.5)と書ける辺りも良い。そして何より、オーバーフローとか気になくていいのは非常に楽。

後日作成した解答(CPP:100ms)

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;
using ll = long long;

int main() {
   int n;
   ll d;
   cin >> n >> d;
   int answer = 0;
   rep(i, n) {
       ll x, y;
       cin >> x >> y;
       if(x*x + y*y <= d*d) answer++;
   }
   cout << answer << endl;
}

そもそも、パソコンで小数点扱うな。

と言うことで、2乗した値を比較しています。最初32bitの「int」で「d,x,y」を扱ってみたんですが、オーバーフローして正しい答えが出力されなかったので、「long long」にしました。読むのであれば、明解さはCPPの方がPythonよりもあるけど、書くのはPythonの方がだいぶ楽な印象。大規模開発とかになると型が明示してある方が楽な気がする(設計にもよる気がするけど)。

ちなみに32bitの整数の最大値と、今回の取りうる最大の値は以下の通り。

//32bit整数の最大値
>>> 1<<31
2147483648
//今回の問題で取りうる最大値
>>> (2*10**5)**2
40000000000

32bitなのに31桁しか扱えないのは、残り1bitが正負を表してるからですね。多分。

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?