1949: 没名字的题
Time Limit: 5 Sec Memory Limit: 1280 MB
Submit: 48 Solved: 6
[Submit][Status][Web Board]
Description
我们知道,在华农有一个特别有名的人,他叫做WeYoung,由于他太过有名了,几乎华农的所有人都认识他。这天是国庆节假期后的第一天,WeYoung跟往常一样在11点早早的起了床,因为已经错过了点名,他决定去校园里找他的朋友们打dota。他的朋友们分布在华农的各个角落,我们把学校看成一个最多二维的空间,那么包括WeYoung在内的所有人的位置可以用一个坐标来表示(可能为一维、二维,表示WeYoung和他的朋友们在同一直线上或者同一平面),比如WeYoung现在就在地下室,位置为(1,1)。现在WeYoung知道n个朋友的位置。为了秀一秀他的捷安特,他想骑的远一点,于是他决定找到两个曼哈顿距离(ps:曼哈顿距离是指两点在各个维度上的距离和,即坐标对应项的差的绝对值和。例如两个点(x0,y0),(x1,y1),那么这两个点的曼哈顿距离为|x0-x1|+|y0-y1|)最大的朋友。但是因为他刚睡醒,脑袋不太灵光,他想让你帮他看一看哪两个朋友的曼哈顿距离最大,相信聪明的你一定能看出来的。
Input
多组数据,第一行为数据组数T(1<T<=100),接下来一行N,D。N为WeYoung知道的朋友的个数,D为坐标的维数(0<N<=100000;0<D<3,坐标值以及输出结果范围为不超过int。接下来N行,每行D个数,为朋友坐标。
Output
输出曼哈顿距离最大的两个朋友的距离。
Sample Input
2
4 1
3
9
6
7
3 2
0 0
1 1
1 -2
Sample Output
6
3
#include<iostream>
using namespace std;
const int infinity = 1000000,maxn = 100005,maxdem = 2;
struct point{
int x[maxdem];
}p[maxn];
int main(){
int t,n,dem;
cin>>t;
while(t--){
cin>>n>>dem;
for(int i=0;i<n;i++){
for(int j=0;j<dem;j++){
cin>>p[i].x[j];
}
}
int maxx[1<<dem],minx[1<<dem],tmp=1<<dem;
for(int i=0;i<tmp;i++){
minx[i] = infinity;
maxx[i] = -infinity;
}
for(int i=0;i<n;i++){
for(int j=0;j<tmp;j++){
int t = j,s = 0;
for(int k=0; k<dem; k++) {
if(t & 1) s += p[i].x[k];
else s -= p[i].x[k];
t >>= 1;
}
if(maxx[j]<s) maxx[j] = s;
if(minx[j]>s) minx[j] = s;
}
}
int ans = -infinity;
for(int i=0;i<tmp;i++){
if(maxx[i] - minx[i] > ans)
ans = maxx[i] - minx[i];
}
cout<<ans<<endl;
}
return 0;
}