2019牛客暑期多校训练营(第三场)----H-Magic Line

首先发出题目链接:
链接:https://ac.nowcoder.com/acm/contest/883/H
来源:牛客网
涉及:思维,简单平面几何

点击这里回到2019牛客暑期多校训练营解题—目录贴


题目如下:
在这里插入图片描述
在这里插入图片描述
此题的方法有好多种,我就讲讲我的方法

首先对所有点按照先将 xx 从小到大,后将 yy 从小到大排序。

那么这条直线可以经过第 n2\frac n{2} 和第 n2+1\frac n{2}+1 个点的中间。假设第 n2\frac n{2} 个点的座标为 (xn2,yn2)(x_{\frac n{2}},y_{\frac n{2}}),第 n2+1\frac n{2}+1 个点的座标为 (xn2+1,yn2+1)(x_{\frac n{2}+1},y_{\frac n{2}+1})

那么这两个点可能满足下面的位置关系:


1.两个点不在同一垂线上,即 xn2xn2+1x_{\frac n{2}} \neq x_{\frac n{2}+1}
在这里插入图片描述
由于排序之后,一半的点的 xx 值肯定比点 Point[n2]Point[\frac n{2}]xx 值要小,另一半的点的 xx 值肯定比 Point[n2+1]Point[\frac n{2}+1]xx 值要大,所以完全可以按照上图一样,在这两个点的中点处画一条垂直线。

但是这条直线可能不经过任何整数座标点,所以需要将这条直线稍微倾斜,如下图
在这里插入图片描述
由于所有点的 xxyy 值都小于1000,而上面直线的经过的两个整点在 x1000,y1000|x|\le1000,|y|\le1000 的区域外面,且在区域内不经过任何整点,直线也刚好经过 Point[n2]Point[\frac n{2}]Point[n2+1]Point[\frac n{2}+1] 的中点,把平面内的点分成了等量的两部分。

if(a.x!=b.x)	printf("%d 999000000 %d %d\n",a.x,b.x,(a.y+b.y)-999000000);//a,b分别指Point[n/2]与Point[n/2+1]

当然把垂直线向左倾斜和向右倾斜都是同样的效果。上图是把垂直线向左倾斜的结果。


2.两个点恰好在同一垂线上,即 xn2=xn2+1x_{\frac n{2}} = x_{\frac n{2}+1}

不妨xn2=xn2+1=xx_{\frac n{2}} = x_{\frac n{2}+1} = x
在这里插入图片描述
对于这种情况,可以做一条直线,如下图
在这里插入图片描述
但是注意,这条直线只能向左倾斜,不能向右倾斜。因为在排序的时候是按照当 xx 相同时,yy 从小到大排序的,所以可能存在某些点的 xx 值与这两个点的 xx 值相同,但是高于点 Point[n2+1]Point[\frac n{2}+1],这些点要被归纳于直线右边的点,才能使得直线左右两半部分的点数量相同。

printf("%d 999000000 %d %d\n",a.x-1,b.x+1,(a.y+b.y)-999000000);	

代码如下:

#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int,int> P;//P的平面上的点类型
int t,n;//题目所给变量
bool comp(P a,P b){
	if(a.x!=b.x)	return a.x<b.x;
	else	return a.y<b.y;
}
int main(){
	cin>>t;
	while(t--){
		scanf("%d",&n);
		P point[1005];
		int i;
		for(i=1;i<=n;i++){
			scanf("%d%d",&point[i].x,&point[i].y);
		}
		sort(point+1,point+n+1,comp);//对所有点按x从小到大,y从小到大排序
		P a=point[n/2],b=point[n/2+1];
		if(a.x!=b.x)	printf("%d 999000000 %d %d\n",a.x,b.x,(a.y+b.y)-999000000);//点在同一垂线上
		else	printf("%d 999000000 %d %d\n",a.x-1,b.x+1,(a.y+b.y)-999000000);	//点不在同一垂线上
	}
    return 0;
}
发布了49 篇原创文章 · 获赞 91 · 访问量 3981
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章