Official
A - 花火大会の観覧 / Watching the Fireworks Festival Editorial
by
A - 花火大会の観覧 / Watching the Fireworks Festival Editorial
by
kyopro_friends
初心者の方へ
- AtCoder をはじめたばかりで何をしたらよいか分からない方は、まずは practice contest の問題A「Welcome to AtCoder」を解いてみてください。基本的な入出力の方法が載っています。
- また、プログラミングコンテストの問題に慣れていない方は、AtCoder Beginners Selection の問題をいくつか解いてみることをおすすめします。
- C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラミングのための C++ 入門用コンテンツです。
- Python入門 AtCoder Programming Guide for beginners (APG4bPython) は、競技プログラミングのための Python 入門用コンテンツです。
問題文の指示通り、 \(N\) 個の花火それぞれについて、ユークリッド距離が \(R\) 以下であるかどうかを判定すればよいです。座標 \((X_i,Y_i)\) と \((X_A,Y_A)\) の間のユークリッド距離は \(\sqrt{(X_i-X_A)^2+(Y_i-X_A)^2}\) です。
しかし、これを直接計算すると浮動小数点数の精度の問題で不正解となります。\(\sqrt{(X_i-X_A)^2+(Y_i-X_A)^2}\leq R\) かどうか判定する代わりに、両辺を 2 乗して \((X_i-X_A)^2+(Y_i-X_A)^2 \leq R^2\) かどうかを判定することで、全ての計算を整数の範囲で誤差なく行うことができます。
言語によっては、オーバーフローを避けるために 64 bit 整数型を使う必要があることに注意してください。
実装例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n, xa, ya, r;
cin >> n >> xa >> ya >> r;
long long ans = 0;
for(int i=0; i<n; i++){
long long xi, yi, p;
cin >> xi >> yi >> p;
if((xi-xa)*(xi-xa) + (yi-ya)*(yi-ya) <= r*r){
ans += p;
}
}
cout << ans << endl;
}
実装例 (Python)
N, XA, YA, R = map(int, input().split())
ans = 0
for _ in range(N):
Xi, Yi, P = map(int, input().split())
if (Xi-XA)**2 + (Yi-YA)**2 <= R**2:
ans += P
print(ans)
posted:
last update:
