AtCoder Beginner Contest 174 B Ich werde das Problem "Distanz" erklären.
Problem-URL: https://atcoder.jp/contests/abc174/tasks/abc174_b
Es gibt $ N $ Punkte auf der zweidimensionalen Ebene und die Koordinaten des $ i $ -ten Punktes sind $ (X_i, Y_i) $. Finden Sie heraus, wie viele dieser Punkte weniger als $ D $ vom Ursprung entfernt sind. Der Abstand zwischen dem Punkt an der Koordinate $ (p, q) $ und dem Ursprung beträgt jedoch $ \ sqrt {p ^ 2 + q ^ 2} $.
・ $ 1 \ leq N \ leq 2 × 10 ^ 5 $
・ $ 0 \ leq D \ leq 2 × 10 ^ 5 $
・
Für dieses Problem können Sie AC schreiben, indem Sie Code schreiben, der ungefähr Folgendes bewirkt:
・ Geben Sie $ N und D $ ein - Deklarieren Sie die Variable $ ans $ als Zähler und initialisieren Sie sie mit 0 ・ Wiederholen Sie die folgenden $ N $ Mal(Der folgende Code ist ein Beispiel für die Antwort in Python.)・ Empfängt $ (X_i, Y_i) $ Informationen und fragt nach $ \ sqrt {{X_i} ^ 2 + {Y_i} ^ 2} $. Wenn es weniger als $ D $ ist, addieren Sie 1 zu $ ans $・ Da $ ans $ die Anzahl der Punkte ist, die kleiner oder gleich $ D $ sind, sollte dies ausgegeben werden.
{B.py}
N,D = map(int,input().split())
ans = 0
for i in range(N):
x,y = map(int,input().split())
if (x**2+y**2)**0.5 <= D:
ans += 1
print(ans)
AC kann mit diesem Code durchgeführt werden. Wenn Sie jedoch "über den Fehler besorgt" sind, ist es möglicherweise besser, ihn wie folgt umzuschreiben.
{B2.py}
N,D = map(int,input().split())
ans = 0
for i in range(N):
x,y = map(int,input().split())
#Hier umschreiben!!
if (x**2+y**2) <= D**2:
ans += 1
print(ans)
$ \ sqrt {{x_i} ^ 2 + {y_i} ^ 2} \ leq Nicht D $ $ {x_i} ^ 2 + {y_i} ^ 2 \ leq D ^ 2 $ wird verwendet, um zu bestimmen, ob es kleiner als $ D $ ist. Ausgehend von der Einschränkung ist dies $ 0 \ leq D $, sodass Sie die Bedingung der Ungleichung wie folgt umschreiben </ b> können. Ein einfacher Vergleich mit $ {x_i} ^ 2 + {y_i} ^ 2 $ führt zu weniger Fehlern als ein einfacher Vergleich mit $ \ sqrt {{x_i} ^ 2 + {y_i} ^ 2} $ (Ganzzahl). Da die Quadrate von addiert werden, kann eine bedingte Verzweigung durchgeführt werden, ohne sich um den Fehler </ b> sorgen zu müssen.
Das Folgende ist ein Beispiel für die Antwort in C ++ und Java.
{B.cpp}
include<bits/stdc++.h>
using namespace std;
int main(){
int n;
long long int d;
cin >> n >> d;
int ans = 0;
for (int i = 0; i < n; i++){
long long int x,y;
cin >> x >> y;
if (x*x+y*y <= d*d){
ans++;
}
}
cout << ans << endl;
}
{B.java}
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n;
long d;
n = scan.nextInt();
d = scan.nextLong();
int ans = 0;
for (int i = 0; i < n; i++) {
long x,y;
x = scan.nextLong();
y = scan.nextLong();
if (x*x+y*y <= d*d) {
ans++;
}
}
System.out.println(ans);
}
}
Übrigens betrug die Berechnungszeit in C ++ 101 ms </ b>, während sie in Java 634 ms </ b> betrug, sodass es offensichtlich ist, dass die Berechnungsgeschwindigkeit von C ++ schnell ist.