时间限制1秒 内存限制64M
题目描述:
Teresa是个有着丰富内心世界的女孩子,时常抬起头来看着北京的夜空。
今夜天上又有着无数繁星,Teresa想着一个有趣的问题:如果把所有夜空中的星星看做二维平面上的点,哪一个点(这个点可以是平面上任意一点)离所有的星星最近呢?最近,意味着对于点
,使
最小。
输入格式:
给定用例组数T。
对于每组用例,给出星星数,
且为奇数,接下来的
行每行给出
和
,
,用空格隔开。
输出格式:
对于每组用例,给出两个整数坐标代表离所有星星最近的位置,两个整数用空格隔开,占一行。
样例输入:
1
3
1 3
2 2
3 1
样例输出:
2 2
题目大意:
在平面上有一些星星,选取一点作为离所有星星的曼哈顿距离和最小的节点。
解题思路:
由于星星都在100*100的方格内,可以保证要求的答案一定也在100*100之内,否则答案更好,而且题目要输出整点,所以直接枚举这10000个点,求出和所有星星的坐标差求和即可。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
#include <string>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int INF=0x3f3f3f3f;
#define CLR0(a) (memset(a,0,sizeof(a)))
#define CLR1(a) (memset(a,-1,sizeof(a)))
#define CLRf(a) (memset(a,0x3f,sizeof(a)))
//#define rush() int t;scanf("%d",&t);while(t--)
const int maxn=0;
const int maxm=0;
int x[1500],y[1500];
int abss(int xx,int yy)
{
int z=xx-yy;
if(z>=0)return z;
return -z;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,xx,yy;
int mi=INF;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&x[i],&y[i]);
}
for(int i=0;i<=100;i++)
for(int j=0;j<=100;j++)
{
int sum=0;
for(int k=0;k<n;k++)
sum+=abss(i,x[k])+abss(j,y[k]);
if(sum<mi)
{
mi=sum;
xx=i;yy=j;
}
}
printf("%d %d\n",xx,yy);
}
return 0;
}