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 }

猜你喜欢

转载自www.cnblogs.com/HOLLAY/p/11256817.html