POJ-2926 Requirements(最遠曼哈頓距離)
阿新 • • 發佈:2018-12-16
題意:求五維空間最遠曼哈頓距離.
思路:曼哈頓距離:dis = |x1-x2|+|y1-y2| 切比雪夫距離:dis = max(|x1-x2|,|y1-y2|)
求曼哈頓距離若去掉絕對值,即在以下4項中選擇最大值. (x1-x2)+(y1-y2) (-x1+x2)+(y1-y2) (x1-x2)+(-y1+y2) (-x1+x2)+(-y1+y2)
再轉化一下
(x1+y1)-(x2+y2) (-x1+y1)-(-x2+y2) (x1-y1)-(x2-y2) (-x1-y1)-(-x2-y2)
即上面這四項的最大值,也就是肯定儘量使減號左邊儘量大,右邊儘量小 而且我們發現減號兩邊的式子的格式都是一樣的,而且只跟一個點有關係,所以我們可以維護一下最大最小值即可
程式碼:
#include<cstdio> #include<iostream> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const int maxn = 2e5+5; const double eps = 1e-8; int n; double a[maxn][6]; double b[123][2]; double solve() { for(int j = 0;j< 1<<5;j++) b[j][0] = -1e15,b[j][1] = 1e15; for(int i = 1;i<= n;i++) { for(int j = 0;j< (1<<5);j++)//列舉所有加減狀態 { double tmp = 0; for(int k = 0;k< 5;k++)//1為+,0為- { if(j&(1<<k)) tmp+= a[i][k]; else tmp-= a[i][k]; } b[j][0] = max(b[j][0],tmp); b[j][1] = min(b[j][1],tmp); } } double ans = 0; for(int i = 0;i< 1<<5;i++) ans = max(ans,b[i][0]-b[i][1]); return ans; } int main() { cin>>n; for(int i = 1;i<= n;i++) for(int j = 0;j< 5;j++) scanf("%lf",&a[i][j]); double ans = solve(); printf("%.2f\n",ans); return 0; }