給出n個d維空間的點。求出曼哈頓距離最大的兩個點的
曼哈頓距離。兩個點(x1, x2...xd)、(x1,x2..xd)的曼哈頓距
離被定義為|x1-x1|+|x2-x2|+...+|xd-xd|.
第一行兩個正整數n,d。
接下來有n,每行描述乙個點的座標。
在第一行輸出曼哈頓距離最大的兩個點的曼哈頓距離。
4 22 1
1 44 5
5 31s
在60%的資料中,1<=n<=100000,1<=d<=2
在100%的資料中,1<=n<=100000,1<=d<=5
cqf為noip2009出的練習題
一道很好的數學題。
曼哈頓距離的定義為|x1-x1|+|x2-x2|+...+|xd-xd|;
我們觀察一下一維的,最大的x減最小的x。
順著這個思路我們看看二維x1+x2最大-(x1+x2)最小可以麼,
不幸的是不行,
反例:4 2
2 2-1 -1
-2 2
2 -2
但反例告訴了我們一些有意思的東西,答案為-(x1-x1)+(x2-x2)
我們嘗試把絕對值去掉,
考慮兩個點xi,yi,xj,yj
其曼哈頓距離為|xi-xj|+|yi-yj|
得到四個式子
xi-xj+yi-yj
xj-xi+yi-yj
xi-xj+yj-yi
xj-xi+yj-yi
最大值不就在其中嗎,並且錯誤的除去絕對值不會超過原有的答案(原來正的變負的了)。
因此,把乙個曼哈頓距離公式中的所有絕對值去除,每個點得到2^k個一維座標,距離最大是不會變的。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8view codeusing
namespace
std;
9 typedef long
long
ll;10 typedef long
double
ld;11 typedef pairpr;
12const
double pi=acos(-1
);13
#define rep(i,a,n) for(int i=a;i<=n;i++)
14#define per(i,n,a) for(int i=n;i>=a;i--)
15#define rep(i,u) for(int i=head[u];i;i=next[i])
16#define clr(a) memset(a,0,sizeof(a))
17#define pb push_back
18#define mp make_pair
19#define fi first
20#define sc second
21#define pq priority_queue
22#define pqb priority_queue , less>
23#define pqs priority_queue , greater>
24#define vec vector
25 ld eps=1e-9
;26 ll pp=1000000007
;27 ll mo(ll a,ll pp)
28 ll powmod(ll a,ll b,ll pp)
29void fre()
30//
void add(int x,int y,int z)
31int dx[5]=,dy[5]=;
32 ll read()
37int a[100005][10
];38
intmain()
3954 ans=max(ans,max-min);55}
56 printf("
%d\n
",ans);
57return0;
58 }
vijos1453 曼哈頓距離
給出n個d維空間的點。求出曼哈頓距離最大的兩個點的曼哈頓距離。兩個點 x1,x2,xd x1,x2,xd 的曼哈頓距離為 x1 x1 x2 x2 xd xd 第一行兩個整數n,d 1曼哈頓距離最大的兩個點的曼哈頓距離。4 2 2 11 4 4 55 36資料規模 60 資料,1 n 1000000,...
曼哈頓距離
切雪兒距離距離是什麼?走過象棋的人就知道。這個距離其實就是max x i x j y i y j 就是兩個點之間的垂直距離和水平距離之間的最大的那個 這個就是象棋裡邊的國王和王后走的最短路 還有乙個歐式距離,別人稱之為歐幾里得距離,也就是我們初中高中學習的兩點之間的直線距離,sqrt x1 y1 2...
曼哈頓距離
題目 description 給出n個d維空間的點。求出曼哈頓距離最大的兩個點的曼哈頓距離。兩個點 x1,x2,xd x1,x2,xd 的曼哈頓距離為 x1 x1 x2 x2 xd xd input 第一行兩個整數n,d 1output 曼哈頓距離最大的兩個點的曼哈頓距離。dfs 位運算 公式推導 ...