zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    WPF中textbox控件的一些样式的后台写法
    SQL中left join、right join、inner join的区别
    WPF引用多个样式
    【转载】C#使用Split函数根据特定分隔符分割字符串
    单例模式
    简单工厂模式
    设计模式简介
    JavaScript--String
    JavaScript--Array
    JavaScript--Object
  • 原文地址:https://www.cnblogs.com/HOLLAY/p/11256817.html
Copyright © 2011-2022 走看看