1949: 没名字的题


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,DN为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;
}
posted @ 2017-12-21 12:39  ACLJW  阅读(105)  评论(0编辑  收藏  举报