2019牛客暑期多校訓練營(第三場)H Magic Line

原題連接:H  Magic Line

題意簡述:

  給定n個點,要求畫一條直線將n個點分紅均有n / 2個點的兩部分,不能有點在線上;c++

解題思路:

  首先,先將全部的點進行以x爲第一關鍵字,y爲第二關鍵字進行排序,接着:ide

  1. 若是a[n / 2 - 1] < a[n / 2],那麼則能夠以(a[n / 2 - 1].x,INF),(a[n / 2].x,- INF)這兩點畫一條符合題意的直線【可是我試了(a[n / 2 - 1].x,a[n/2-1].y + INF) (a[n / 2].x,a[n/2].y - INF)也是能夠的】
  2. 若是a[n / 2 - 1] == a[n / 2],那麼則能夠根據(a[n / 2].x - 1,a[n / 2].y + INF),(a[n / 2 - 1].x + 1,a[n / 2 - 1].y - INF)這兩題畫一條符合題意的直線;

                                          第一種狀況spa

111111111111

 

 對於第二種狀況,咱們首先根據a1(a[n / 2].x - 1,a[n / 2].y + INF)這點作出關於(a[n / 2].x,a[n / 2].y)的對稱點a2(a[n / 2].x + 1,a[n / 2].y - INF),因爲a[n / 2].x == a[n / 2 - 1].x ,而且a[n / 2].y > a[n / 2 - 1].y,那麼咱們能夠將(a[n / 2 - 1].x,a[n / 2 - 1].y - INF)看做是a2點向下移了一點(記爲a2'),那麼此時的a2'與a1這兩點肯定的直線一定符合題意;code

 代碼以下:(參考自咖啡雞)

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pi;
pi a[15555];
int n,T;
const int E=900000000;

int main(){
    cin >> T;
    while (T--){
        cin >> n;
        for (int i = 0; i < n; i++) cin >> a[i].x >> a[i].y;
        sort(a, a + n);
        if (a[n/2 - 1].x<a[n/2].x)    printf("%d %d %d %d\n", a[n/2-1].x, a[n/2-1].y + E, a[n/2].x, a[n/2].y - E);
        else    printf("%d %d %d %d\n", a[n/2].x - 1, a[n/2].y + E, a[n/2].x + 1, a[n/2-1].y - E);
    }
}
Magic Line
相關文章
相關標籤/搜索