2019牛客多校训练第三场H.Magic Line(思维)
大致题意:
输入测试用例个数T,输入点的个数n(n为偶数),再分别输入n个不同的点的坐标,要求输出四个整数x1,y1,x2,y2,表示有一条经过点(x1,y1),(x2,y2)的直线将该二维平面内的点分成点数相等的两部分。(这条线不能通过平面内任何一点)
sample input:
1
4
0 1
-1 0
1 0
0 -1
sample output:(special judge)
-1 999000000 1 -999000001
题解:
将这n个点以x为第一关键字y为第二关键字从小到大排序,找到中间两个点a和b,以这两个点为分界,可发现始终有一条通过a和b中点的很陡的直线可以将平面内的点分成点数相等的两部分。
若排序后中间a、b两点的x坐标不一样,则随便一条划在a、b两点之间的直线都可以;若排序后中间a、b两点的x坐标一样,则一定要过a、b中点的直线才行。
Code:
1 #include<bits/stdc++.h> 2 #define IO ios::sync_with_stdio(false); 3 using namespace std; 4 const int m=99990000; 5 struct point 6 { 7 int x,y; 8 }p[1005]; 9 bool cmp(point s1,point s2) 10 { 11 if(s1.x==s2.x)return s1.y<s2.y; 12 else return s1.x<s2.x; 13 } 14 int main() 15 { 16 IO;int T,n; 17 cin>>T; 18 while(T--) 19 { 20 int x1,y1,x2,y2; 21 cin>>n; 22 for(int i=0;i<n;i++) 23 cin>>p[i].x>>p[i].y; 24 sort(p,p+n,cmp); 25 if(p[n/2].x!=p[n/2-1].x) 26 x1=p[n/2-1].x,y1=m,x2=p[n/2].x,y2=-m; 27 else 28 x1=p[n/2].x-1,y1=p[n/2].y+m,x2=p[n/2].x+1,y2=p[n/2-1].y-m; 29 cout<<x1<<' '<<y1<<' '<<x2<<' '<<y2<<endl; 30 } 31 return 0; 32 }