2019牛客暑期第三场 H.Magic Line(思维,几何)

本文介绍了一种通过排序和直线划分实现点集均匀分布的算法。该算法首先按横坐标排序点集,若横坐标相同则按纵坐标排序,接着在中间点附近构造一条直线,确保直线两侧的点数相等,从而实现点集的有效划分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

   给出n个点的坐标,画出一条直线将这些点分开,每边各占一半

题解

   将这些点的横坐标排序,如果相等,则排纵坐标的大小,然后在极远处稍微倾斜这条直线,就可以将这些点分开

当两个y相同时,一定过中心点(a[n/2].x, 0),然后向上平移a[n/2].y, 就一定经过点 (a[n/2].x , a[n/2].y), 只需将直线右端点向上平移一点距离,直线就不会过点 (a[n/2].x , a[n/2].y), 将两边完全分开

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x, y;
}a[200005];
bool cmp(node k, node u){
	if(k.x != u.x){
		return k.x < u.x;
	}
	return k.y < u.y;
}
int main(){
	int t;
	cin >> t;
	while(t--){
		int n;
		cin >> n;
		for(int i = 1; i <= n; i++){
			cin >> a[i].x >> a[i].y;
		}
		sort(a+1, a+1+n, cmp);
		cout << a[n/2].x-1 << " " << a[n/2].y+999000000 << " " << a[n/2].x+1 << " " << a[n/2].y-998999999 << endl;     
         //此处加或减的值要大但要适当,否则会出错
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值