广东外语外贸大学第16届程序设计竞赛C题

广东外语外贸大学第16届程序设计竞赛C 井大师的码魂

C 井大师的码魂

Description

奇奇哥最近在玩一款叫《码魂3》的游戏,游戏中有一个著名的场景叫环印城箭阵。当你接近这个场景的时候,会忽然从地面下冒出很多幽灵弓箭手向你射出大量弓箭,奇奇哥第一次跑过去的时候被射成了刺猬。
奇奇哥试了很多次,都没有通过箭阵,他非常伤心,仿佛失去了灵魂。正在他要放弃的时候,忽然产生了一个奇妙的想法,如果他引导这些幽灵弓箭手互相攻击,不就可以通过这个场景了吗!
奇奇哥尝试了一下,发现只要前进路线正确(奇奇哥沿直线前进),而且他跑的也足够快,从左边冒出来的弓箭手会射到右边冒出来的弓箭手,右边冒出来的弓箭手会射到从左边冒出来的弓箭手,奇奇哥成功找到了攻略箭阵的方法!
但是这样一条前进路线非常难找,因为必须保证所有弓箭手都被其他弓箭手射死,否则这些弓箭手就会向奇奇哥发起攻击,所以路线左右两边的弓箭手数目必须一致。奇奇哥非常苦恼,面对游戏中数百个弓箭手,想找到这样一条路线是非常难的。
请你帮帮奇奇哥,找出一条正确的前进路线,使得路线两边的弓箭手数目是一样的。

Input

第一行是一个正整数T,表示数据组数( T <= 200000 )

随后对于每一组数据,第一行是一个正整数n,表示弓箭手的数量( n是偶数 且 2 <= n <= 200000 )

随后n行,每行两个整数x, y,表示第i个弓箭手的位置 (-1000000 <= x, y <= 1000000)

保证任意两个弓箭手不在同一个位置,且所有样例的弓箭手数量之和<=1000000

Output

因为两点确定一条直线,所以输出奇奇哥前进路线上任意两个不同的点(精确到小数点后6位)

Sample Input 1

1
4
6 8
8 4
10 4
8 8

Sample Output 1

7.000000 8.000000
9.000000 4.000000

思路

找一条直线把给出的偶数个坐标点平分
先将所有点进行排序,找到最中间两点,两点的连线偏移一点点即可满足题意。


给出的坐标点都是整数,偏移量为小数时不会穿过任意一点。
粉色线就是样例中间两点连线,黑色是输出样例。按着粉色线稍微偏移一点点就是答案。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000007;
typedef long long ll;
struct node
{
 int x,y;
}w[200005];
bool cmp(node a,node b)
{
 if(a.y==b.y) return a.x<b.x;
 return a.y<b.y;
}
int main()
{
 int t,n;
 double a,b,c,d;
 cin>>t;
 while(t--)
 {
  cin>>n;
  for(int i=0;i<n;i++)
   cin>>w[i].x>>w[i].y;
  sort(w,w+n,cmp);
  n/=2;
  a=w[n].x-100000000;
  b=w[n].y+0.1;
  c=w[n-1].x+100000000;
  d=w[n-1].y-0.1;
  printf("%.6f %.6f\n%.6f %.6f\n",a,b,c,d);
 }
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值