题意
给出 p p p和 q q q,以及 n n n个点,求出其中最接近 p , q p,q p,q的斜率。
思路
代码
#include <cmath>
#include <cstdio>
#include <algorithm>
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
struct node {
int x, y;
double b;
}a[200001];
int n, ansp, ansq;
double p, q, ansx = 10000000000;
bool operator <(const node &a, const node &b) {
return a.b < b.b;
}
int main() {
file(slope);
scanf("%d %lf %lf", &n, &p, &q);
double k = p / q;
for (int i = 1; i <= n; i++)
scanf("%d %d", &a[i].x, &a[i].y), a[i].b = (double)a[i].y - k * a[i].x;
std::sort(a + 1, a + n + 1);
for (int i = 1; i < n; i++) {
double slope = fabs((double)(a[i].y - a[i + 1].y) / (a[i].x - a[i + 1].x));
if (fabs(k - slope) < ansx || fabs(k - slope) == ansx && slope < (double)ansp / ansq) {
ansx = fabs(k - slope);
ansp = abs(a[i].y - a[i + 1].y);
ansq = abs(a[i].x - a[i + 1].x);
}
}
int d = std::__gcd(ansp, ansq);
printf("%d/%d", ansp / d, ansq / d);
}