给定n个点,要求画一条直线将n个点分红均有n / 2个点的两部分,不能有点在线上;c++
首先,先将全部的点进行以x为第一关键字,y为第二关键字进行排序,接着:ide
第一种状况spa
对于第二种状况,咱们首先根据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); } }