zoukankan      html  css  js  c++  java
  • 【JZOJ6290】倾斜的线【计算几何】

    题目大意:

    题目链接:https://jzoj.net/senior/#main/show/6290
    在这里插入图片描述


    思路:

    以下令k=pqk=frac{p}{q}
    首先,画出对于每一个点斜率为kk的直线,将这些点以斜率为kk的截距排序。如下图。
    在这里插入图片描述
    此时我们假设存在三条有序x,y,zx,y,z,那么直线xzxz的斜率一定不是最接近kk的。因为直线xy,yzxy,yz中必然有一条的斜率大于xzxz,另外一条的斜率必然小于xzxz。那么直线xzxz的斜率最接近kk当且仅当xzxz的斜率等于kk。但是此时就一定有x,zx,z两点排序后是相邻的,但是我们规定了中间必然夹着一个点yy,所以xzxz的斜率也不可能为kk
    例如下图,x=2,y=3,z=5x=2,y=3,z=5
    在这里插入图片描述
    此时直线xyxy的斜率就小于直线xzxz的斜率,直线yzyz的斜率就大于直线xzxz的斜率。
    同时,容易发现直线xyxy的斜率是相对于另外两条直线的斜率更加接近于kk的。
    归纳一下,一条直线可能为答案当且仅当该直线的端点编号相邻。
    那么可能的直线就只有n1n-1条了,直接排序后暴力判断一下就可以了。


    代码:

    #include <cmath>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    
    const int N=200010;
    ll P,Q,p,q,GCD;
    double k;
    int n;
    
    struct node
    {
    	double b;
    	ll x,y;
    }a[N];
    
    bool cmp(node x,node y)
    {
    	return x.b<y.b;
    }
    
    int main()
    {
    	freopen("slope.in","r",stdin);
    	freopen("slope.out","w",stdout);
    	scanf("%d%lld%lld",&n,&P,&Q);
    	k=(double)P/(double)Q;
    	for (int i=1;i<=n;i++)
    	{
    		scanf("%lld%lld",&a[i].x,&a[i].y);
    		a[i].b=(double)a[i].y-k*(double)a[i].x;
    	}
    	sort(a+1,a+1+n,cmp);
    	p=abs(a[1].y-a[2].y),q=abs(a[1].x-a[2].x);
    	for (int i=2;i<n;i++)
    	{
    		double k1=(double)abs(a[i].y-a[i+1].y)/(double)abs(a[i].x-a[i+1].x);
    		double k2=(double)p/(double)q;
    		if (fabs(k1-k)<fabs(k2-k)) p=abs(a[i].y-a[i+1].y),q=abs(a[i].x-a[i+1].x);
    			else if (fabs(k1-k)==fabs(k2-k) && k1<k2) p=abs(a[i].y-a[i+1].y),q=abs(a[i].x-a[i+1].x);
    	}
    	GCD=__gcd(q,p);
    	printf("%lld/%lld",p/GCD,q/GCD);
    	return 0;
    }
    
  • 相关阅读:
    C++11 并发指南三(Lock 详解)
    C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
    C++11 并发指南六(atomic 类型详解三 std::atomic (续))
    C++11 并发指南六( <atomic> 类型详解二 std::atomic )
    C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)
    C++11 并发指南五(std::condition_variable 详解)
    腾讯地图定位及坐标解析
    控制器里把文件转为二进制输出下载
    C#操作mongodb简记
    MYSQL备份还原问题
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998053.html
Copyright © 2011-2022 走看看