Xin chào mọi người, chẳng là em đang làm bài tính 2 điểm ngắn nhất. Mà em làm rồi thì không biết sai chỗ nào, mọi người giúp em với
#include "pch.h"
#include <algorithm>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
//binary search
int binarySearch(vector<int> a, double key, int left, int right)
{
int mid = (left + right) / 2;
if ((mid == left && a[mid] > key) || (mid == right && a[mid] < key) || (a[mid] == key)) return mid;
else if ((a[mid] > key && a[mid - 1] < key) || (a[mid]<key && a[mid + 1]>key)) return mid;
else if (a[mid] > key) return binarySearch(a, key, left, mid);
else if (a[mid] < key) return binarySearch(a, key, mid + 1, right);
}
// 3 way quick sort
void partition(vector <int> &a, vector <int> &b, int l, int r, int &i, int &j)
{
i = l - 1, j = r;
int p = l - 1, q = r;
int v = a[r];
while (true)
{
while (a[++i] < v);
while (v < a[--j])
if (j == l)
break;
if (i >= j) break;
swap(a[i], a[j]);
swap(b[i], b[j]);
if (a[i] == v)
{
p++;
swap(a[p], a[i]);
swap(b[p], b[i]);
}
if (a[j] == v)
{
q--;
swap(a[j], a[q]);
swap(b[j], b[q]);
}
}
swap(a[i], a[r]);
swap(b[i], b[r]);
j = i - 1;
for (int k = l; k < p; k++, j--)
{
swap(a[k], a[j]);
swap(b[k], b[j]);
}
i = i + 1;
for (int k = r - 1; k > q; k--, i++)
{
swap(a[i], a[k]);
swap(b[i], b[k]);
}
}
void quicksort(vector <int> &a, vector<int> &b, int l, int r)
{
if (r <= l) return;
int i, j;
partition(a, b, l, r, i, j);
quicksort(a, b, l, j);
quicksort(a, b, i, r);
}
double part_minimal_distance(vector<int> &x, vector<int> &y, int left, int right)
{
if (right - left == 2)
{
double a = sqrt(pow(x[left] - x[right], 2) + pow(y[left] - y[right], 2));
double b = sqrt(pow(x[left+1] - x[right], 2) + pow(y[left+1] - y[right], 2));
double c = sqrt(pow(x[left] - x[right-1], 2) + pow(y[left] - y[right-1], 2));
double min = a > b ? b : a;
return min > c ? c : min;
}
else if (right - left == 1)
{
return sqrt(pow(x[left] - x[right], 2) + pow(y[left] - y[right], 2));
}
if (right == left) return -1;
int mid = (left + right) / 2;
double d1 = part_minimal_distance(x, y, left, mid);
double d2 = part_minimal_distance(x, y, mid + 1, right);
double min = d1 > d2 ? d2 : d1;
//
int l = binarySearch(x, x[mid] - min, left, right);
int r = binarySearch(x, x[mid] + min, left, right);
quicksort(y, x, l, r);
double min2 = 0;
for (int i = l; i <= r; i++)
{
for (int j = 1; j <= 7; j++)
{
if (i+j > r) break;
double d = sqrt(pow(x[i] - x[i+j], 2) + pow(y[i] - y[i+j], 2));
if (min2 == 0) min2 = d;
else min2 = min2 > d ? d : min2;
}
}
return min > min2 ? min2 : min;
}
double minimal_distance(vector<int> &x, vector<int> &y) {
//write your code here
quicksort(x, y, 0, x.size()-1);
return part_minimal_distance(x, y, 0, x.size() - 1);
}
int main() {
size_t n;
cin >> n;
vector<int> x(n);
vector<int> y(n);
for (size_t i = 0; i < n; i++) {
cin >> x[i] >> y[i];
}
cout << fixed;
cout << setprecision(9) << minimal_distance(x, y) << "\n";
}
Thuật toán của em làm theo hướng dẫn này:
Em nghĩ rằng code em nó sai chỗ này:
int l = binarySearch(x, x[mid] - min, left, right);
int r = binarySearch(x, x[mid] + min, left, right);
quicksort(y, x, l, r);
double min2 = 0;
for (int i = l; i <= r; i++)
{
for (int j = 1; j <= 7; j++)
{
if (i+j > r) break;
double d = sqrt(pow(x[i] - x[i+j], 2) + pow(y[i] - y[i+j], 2));
if (min2 == 0) min2 = d;
else min2 = min2 > d ? d : min2;
}
}
return min > min2 ? min2 : min;