11.02T1 几何
傾斜的線
(slope.cpp)
【問題描述】
給定兩個正整數P和Q。在二維平面上有n個整點?,F在請你找到一對點使得經過它們的直線的斜率在數值上最接近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都是正整數。
【樣例輸入與輸出】
| example_slope1.in | example_slope1.out |
| 6 15698 17433 112412868 636515040 122123982 526131695 58758943 343718480 447544052 640491230 162809501 315494932 870543506 895723090 | 193409386/235911335 |
?????? 更多樣例請見example/slope/目錄。
【數據范圍】
對于1~10號測試點(50%):n<=1000。
對于所有測試點(100%):n<=400000。
?
?
?
?
把所有點按照P/Q斜率投射到y軸上排序,可以證明相鄰的點對應的線段一定有一條是最優解,因為不相鄰的點與給定的斜率夾角比相鄰的大
code:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #define N 1000006 6 using namespace std; 7 struct node{ 8 long double x,y,w; 9 }e[N]; 10 bool cmp(const node&a,const node&b){ 11 return a.w<b.w; 12 } 13 long double getk(int i,int j){ 14 return (e[i].y-e[j].y)/(e[i].x-e[j].x); 15 } 16 int gcd(int a,int b){ 17 if(a<b)swap(a,b); 18 while(a=a%b)swap(a,b); 19 return b; 20 } 21 int main(){ 22 int n; 23 long double P,Q; 24 cin>>n>>P>>Q; 25 for(int i=1;i<=n;i++){ 26 cin>>e[i].x>>e[i].y; 27 e[i].w=e[i].y-e[i].x*P/Q; 28 } 29 sort(e+1,e+n+1,cmp); 30 long double delta=9999999.0; 31 int now1,now2; 32 for(int i=1;i<n;i++){ 33 if(fabs(getk(i,i+1)-P/Q)<delta){ 34 now1=i,now2=i+1; 35 delta=fabs(getk(i,i+1)-P/Q); 36 } 37 else if(fabs(getk(i,i+1)-P/Q)==delta){ 38 if(getk(i,i+1)-P/Q<0){ 39 now1=i,now2=i+1; 40 } 41 } 42 } 43 int deltax=e[now1].x-e[now2].x,deltay=e[now1].y-e[now2].y; 44 if(deltax<0)deltax=-deltax,deltay=-deltay; 45 int GCD=gcd(abs(deltax),abs(deltay)); 46 cout<<deltay/GCD<<"/"<<deltax/GCD; 47 return 0; 48 }over
轉載于:https://www.cnblogs.com/saionjisekai/p/9898487.html
總結
以上是生活随笔為你收集整理的11.02T1 几何的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python:爬虫初体验
- 下一篇: 利用js-xlsx.js插件实现Exce