Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

점 개수에 대한 쿼리는 C++의 원 안에 있습니다.

<시간/>

이 문제에서는 2D 평면에 있는 n개의 점이 주어지며 각 좌표는 (x,y)입니다. 우리의 임무는 두 가지 쿼리를 푸는 것입니다. 각 쿼리에 대해 정수 R이 제공됩니다. 원점에서 원의 중심과 반지름 R을 취하여 원 안에 있는 점의 수를 찾아야 합니다.

문제 설명

각 쿼리에 대해 반지름 R과 중심점 원점(0, 0)의 원 내부(즉, 원주 내부)에 있는 n개의 점 중에서 총 점 수를 찾아야 합니다.

문제를 더 잘 이해하기 위해 예를 들어 보겠습니다.

입력

n = 4
2 1
1 2
3 3
-1 0
-2 -2
Query 1: 2

출력

1

설명 − 쿼리의 경우 반지름은 2이고 점은 -1 0이며 원 안에 있고 나머지는 모두 원 밖에 있습니다.

원의 수학 방정식은 (x2 - x1)2 + (x2 - x1)2 =r2입니다. 따라서 중심이 (0,0)인 원 안에 점이 있어야 합니다. 점 (x,y)는 x2 + y2 <=r2를 만족해야 합니다.

이 문제를 해결하기 위해 간단한 접근 방식은 각 쿼리에 대한 모든 점을 탐색하고 수식을 사용하지 않고 원의 둘레 안에 있는지 확인하는 것입니다.

우리 솔루션의 작동을 설명하는 프로그램

예시

#include <iostream>
using namespace std;

int solveQuery(int x[], int y[], int n, int R) {
   int count = 0;
   for(int i = 0; i< n ; i++){
      if(((x[i]*x[i]) + (y[i]*y[i]) ) <= (R*R) )
      count++;
   }
   return count;
}
int main() {

   int x[] = { 2, 1, 3, -1, -2 };
   int y[] = { 1, 2, 3, 0, -2 };
   int n = sizeof(x) / sizeof(x[0]);
   int Q = 2;
   int query[] = {4, 2 };

   for(int i = 0; i < Q; i++)
   cout<<"For Query "<<(i+1)<<": The number of points that lie inside the circle is "<<solveQuery(x,    y, n, query[i])<<"\n";
   return 0;
}

출력

For Query 1: The number of points that lie inside the circle is 4
For Query 2: The number of points that lie inside the circle is 1

이 접근 방식을 사용하는 문제에 대한 솔루션은 O(n*Q)의 시간 복잡도를 갖습니다. 각 쿼리에 대해 모든 n 포인트에 대해 x2 + y2 값을 계산하기 때문입니다.

따라서 효율적인 솔루션 모든 n 포인트에 대해 x2 + y2 값을 미리 계산합니다. 그리고 모든 쿼리에 사용할 수 있는 배열에 저장합니다. 그런 다음 각 쿼리에 대한 솔루션을 찾으십시오. 프로그램을 더욱 최적화하기 위해 배열을 정렬한 다음 원 밖에 있는 첫 번째 요소를 찾을 수 있습니다. 소요 시간을 개선하기 위해.

우리 솔루션의 작동을 설명하는 프로그램

예시

#include <bits/stdc++.h>
using namespace std;

int solveQuery(int points[], int n, int rad) {

   int l = 0, r = n - 1;
   while ((r - l) > 1) {
      int mid = (l + r) / 2;
      if (points[mid] > (rad * rad))
      r = mid - 1;
      else
      l = mid;
   }
   if ((sqrt(points[l])) > (rad * 1.0))
   return 0;
   else if ((sqrt(points[r])) <= (rad * 1.0))
   return r + 1;
   else
   return l + 1;
}

int main() {

   int n = 5;
   int point[n][2] = { {2, 1}, {1, 2}, {3, 3}, {-1, 0}, {-2, -2} };
   int Q = 2;
   int query[] = {4, 2 };
   int points[n];
   // Precomputing Values
   for (int i = 0; i < n; i++)
   points[i] = ( point[i][0]*point[i][0] ) + ( point[i][1]*point[i][1] );
   sort(points, points + n);
   for(int i = 0; i < Q; i++)
   cout<<"For Query "<<(i+1)<<": The number of points that lie inside the circle is "         <<solveQuery(points, n, query[i])<<"\n";
   return 0;
}

출력

For Query 1: The number of points that lie inside the circle is 4
For Query 2: The number of points that lie inside the circle is 1