题意

问题描述

给定两个正整数P和Q。在二维平面上有n个整点。现在请你找到一对点使得经过它们的直线的斜率在数值上最接近P/Q(即这条直线的斜率与P/Q的差最小),请输出经过它们直线的斜率p/q。如果有两组点的斜率的接近程度相同,请输出较小的斜率。保证答案的p/q > 0,即输出的p和q都是正整数。

输入格式

输入文件名为slope.in。

第一行三个正整数n P Q。

接下来n行每行两个正整数x y表示一个点的坐标。保证不存在x坐标相同或者y坐标相同的点(即斜率不会为无穷大与0)。

输出格式

输出文件名为slope.out。

输出仅一行,格式为p/q,表示最接近的斜率,其中p和q都是正整数。

样例输入

6 15698 17433

112412868 636515040

122123982 526131695

58758943 343718480

447544052 640491230

162809501 315494932

870543506 895723090

样例输出

193409386/235911335

分析

\[|\frac{y_1-y_2}{x_1-x_2}-\frac{P}{Q}|\\
=|\frac{(y_1Q-x_2P)-(y_2Q-x_2P)}{x_1Q-x_2Q}|
\]

然后就是斜率绝对值最小问题,是斜率最大的对偶问题。

按纵坐标排序即可。

代码

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const ll INF=1e18; const int MAXN=2e5+7; int n;
ll P,Q; struct node
{
ll x,y;
int id;
bool operator<(const node&rhs)const
{
return y<rhs.y;
} double operator/(const node&rhs)
{
return (double)(rhs.y-y)/(double)(rhs.x-x);
}
}origin[MAXN],pnt[MAXN]; int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
} int main()
{
freopen("slope.in","r",stdin);
freopen("slope.out","w",stdout);
read(n);read(P);read(Q);
for(int i=1;i<=n;++i)
{
int x,y;
origin[i].x=read(x);origin[i].y=read(y);
pnt[i].id=i;
pnt[i].y=(ll)y*Q-(ll)x*P;
pnt[i].x=(ll)x*Q;
}
sort(pnt+1,pnt+n+1);
double del=INF;
int ans;
for(int i=1;i<n;++i)
{
if(abs(pnt[i]/pnt[i+1])<del)
ans=i,del=abs(pnt[i]/pnt[i+1]);
else if(abs(pnt[i]/pnt[i+1])==del)
{
ans=(origin[pnt[ans+1].id]/origin[pnt[ans].id]<origin[pnt[i+1].id]/origin[pnt[i].id])?ans:i;
}
}
int p=origin[pnt[ans+1].id].y-origin[pnt[ans].id].y,q=origin[pnt[ans+1].id].x-origin[pnt[ans].id].x;
p=abs(p),q=abs(q);
int g=gcd(p,q);
printf("%d/%d\n",p/g,q/g);
// fclose(stdin);
// fclose(stdout);
return 0;
}

test20180922 倾斜的线的更多相关文章

  1. MarkDown初体验

    初体验 写在前面 一周前第一次听说了MarkDown这个编辑器,通过它知道了LaTex,正好满足了我多年对网上博客里的公式简陋的表达的需求.起初,只是用到了LaTex公式这一个功能 , 对于主要文字的 ...

  2. BZOJ4403 序列统计—Lucas你好

    绝对是全网写的最详细的一篇题解  题目:序列统计 代码难度:简单 思维难度:提高+-省选 讲下题面:给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案 ...

  3. BZOJ3505 & 洛谷P3166 [Cqoi2014]数三角形 【数学、数论】

    题目 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. 输入格式 输入一行,包含两个空格分隔的正整数m和n. 输出格式 输出 ...

  4. 学Python的第一天

    第一天学习笔记 一.安装typroa 下载软件typroa用于日常学习笔记记录,该软件支持markdown语法 步骤: 官网地址:https://typora.io/ 选择版本安装(以windows为 ...

  5. H5中被废弃的标签

    <br>换行,已经被<p>标签进行替换 <hr>画线 <font> <b>,<u>,<i>,<s>:加粗 ...

  6. NOIp2018集训test-9-22(am/pm) (联考三day1/day2)

    szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...

  7. 2019-08-17 纪中NOIP模拟B组

    T1 [JZOJ3503] 粉刷 题目描述 鸡腿想到了一个很高(sha)明(bi)的问题,墙可以看作一个N*M的矩阵,有一些格子是有污点的.现在鸡腿可以竖着刷一次,覆盖连续的最多C列,或者横着刷一次, ...

  8. GDI+ 绘制砂岩含量图版

    图版是在工作中经常会使用到的工具,它能够大大提高我们日常工作效率.地质图版在地质工作中具有举足轻重的作用,不仅可以轻松判断岩性,也可以依据经验图版直接得到结果,十分方便. 本程序目的绘制出一个地质常用 ...

  9. java入土---markdown使用技巧

    markdown使用技巧 标题 "#" 为一级标题 "##" 为2级标题 可一直往下曾增加,最多六级标题 字体 加粗 **加粗** 加粗 倾斜 *倾斜* 倾斜 ...

随机推荐

  1. 在浏览器外打开PDF文档

    One function you might find annoying with PDFs and PDF Readers is that when you click on a link to a ...

  2. android--------微信 Tinker 热修复 (二)

    前面简单介绍了一下Tinker热修复,今天就来分享一下如何在Android中使用,希望对各位有帮助. 1:Tinker 接入指南 在项目的build.gradle中,添加tinker-patch-gr ...

  3. android--------listview之适配器

    ListView之适配器的使用,包含了ArrayAdapter,SimpleAdapter ,BaseAdapter等适配器. 1:ArrayAdapter /**** * * * ArrayAdap ...

  4. Java 历史

    James Gosling 最初开始 Java 语言项目是在 1991 年的 7 月.Java 被用在他的许多 set-top box 工程中.这个语言最开始的时候被称为 Oka,这个是因为 Jame ...

  5. Knights of a Polygonal Table CodeForces - 994B (贪心)

    大意:n个骑士, 每个骑士有战力p, 钱c, 每个骑士可以抢战力比他低的钱, 每个骑士最多抢k次, 对每个骑士求出最大钱数 按战力排序后, 堆维护动态前k大即可 #include <iostre ...

  6. mxnet(gluon) 实现DQN简单小例子

    参考文献 莫凡系列课程视频 增强学习入门之Q-Learning 关于增强学习的基本知识可以参考第二个链接,讲的挺有意思的.DQN的东西可以看第一个链接相关视频.课程中实现了Tensorflow和pyt ...

  7. C++中的this指针

    1.关于this指针的一个精典回答: 当你进入一个房子后,你可以看见桌子.椅子.地板等,但是房子你是看不到全貌了.对于一个类的实例来说,你可以看到它的成员函数.成员变量,但是实例本身呢?this是一个 ...

  8. hdu-4678-sg

    Mine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  9. HDU1506(真心不错的DP)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  10. 组播IP地址

    组播IP地址组播IP地址用于标识一个IP组播组.IANA(internet assigned number authority)把D类地址空间分配给IP组播,其范围是从224.0.0.0到239.25 ...