链接:
https://www.nowcoder.com/acm/contest/112/E
来源:牛客网
来源:牛客网
题目描述
小W非常喜欢某个有理数P/Q,而且他非常喜欢用它来进行一些玄学操作。他在二维平面上撒下了n个点,这些点相互不同,但一番观察之后,他失望的发现并没有任何两个点连成的直线的斜率是P/Q。你能不能告诉他在这些斜率中最接近P/Q的是多少。
输入描述:
第一行包括三个正整数n,P,Q(5<=n<=106,1<=P,Q<=105)
接下来n行,每行两个正整数x,y表示点的坐标(0<=x,y<=109)
输出描述:
一个有理数P’/Q’表示最接近P/Q的斜率
题解:
求(y2-y1)/(x2-x1)最接近P/Q,移项得Q*y2-P*x2最近接Q*y1-P*x1
排序,判断相邻的两项即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+7;
struct node
{
ll x,y,s;
} c[maxn];
ll gcd(ll a,ll b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
bool cmp(const node &a,const node &b)
{
return a.s<b.s;
}
int main()
{
ll n,P,Q;
scanf("%lld%lld%lld",&n,&P,&Q);
for(int i=0; i<n; i++)
{
scanf("%lld%lld",&c[i].x,&c[i].y);
c[i].s=Q*c[i].y-P*c[i].x;
}
sort(c,c+n,cmp);
double mi=1e18;
ll a,b;
for(int i=1; i<n; i++)
{
ll x1=c[i].x-c[i-1].x;
ll y1=c[i].y-c[i-1].y;
if(x1<0)
x1=-x1;
if(y1<0)
y1=-y1;
double s=fabs(1.00*y1/x1-1.00*P/Q);
if(s<mi)
{
mi=s;a=x1,b=y1;
}
}
ll g=gcd(a,b);
printf("%lld/%lld\n",b/g,a/g);
return 0;
}
本文介绍了一种算法,用于解决在给定点集中找到斜率最接近特定有理数P/Q的点对的问题。通过计算斜率并进行排序,最终找出最接近目标斜率的点对。
321

被折叠的 条评论
为什么被折叠?



