题目描述
题目解析
按每个点作为一条斜率为 QP\frac Q PPQ 的直线上一点时这条直线的截距排序(即 y−QPxy-\frac Q P xy−PQx),然后最优解一定是排序后的相邻两个。
相邻的两个求出最优的 p/qp/qp/q ,化简后输出
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
double P,Q,k,minn=1e9,ax,ay;
struct A
{
double x,y,b;
}a[200005];
bool cmp(A a,A b) {return a.b<b.b;}
ll gcd(ll x,ll y) {return y?gcd(y,x%y):x;}
int main()
{
freopen("slope.in","r",stdin);
freopen("slope.out","w",stdout);
cin>>n>>P>>Q;
for(int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y,a[i].b=a[i].y-P/Q*a[i].x;
sort(a+1,a+1+n,cmp);
for(int i=1;i<n;i++)
{
k=(a[i].y-a[i+1].y)/(a[i].x-a[i+1].x);
if(abs(k-P/Q)<minn) minn=abs(k-P/Q),ax=abs(a[i].x-a[i+1].x),ay=abs(a[i].y-a[i+1].y);
}
ll x=ax,y=ay;
ll r=gcd(x,y);
cout<<y/r<<"/"<<x/r;
}