最远城市距离
内存限制: 256 Mb时间限制: 1000 ms
题目描述
设两个点的坐标分别为 (x,y)(x,y) 与 (x′,y′)(x′,y′),定义这两个点的城市距离为
∣x−x′∣+∣y−y′∣
给定 n 个点的坐标,请从中寻找两个点,使得它们的城市距离达到最大,输出这个最大值。
输入格式
- 第一行:单个整数 n。
- 第二行到第 n+1 行:每行有两个整数 xi 和 yi,表示一个点的坐标。
输出格式
- 单个整数:表示最大的城市距离。
数据范围
- 对于 30% 的数据,2 ≤ n ≤ 5,000
- 对于 60% 的数据,2 ≤ n ≤ 50,000
- 对于 100% 的数据,2 ≤ n ≤ 500,000
- −500,000,000 ≤ xi,yi ≤ 500,000,000
样例数据
输入:
4
0 0
0 1
1 3
3 2
输出:
5
说明:
(0,0)与(3,2)的城市距离是最大的
这一个题目使用的是曼哈顿距离,公式如下(题目给了)
∣x−x′∣+∣y−y′∣∣x−x′∣+∣y−y′∣
哇!居然有两个绝对值!
是时候派出分类讨论啦
如果两个绝对值都是正数:(x−x′)+(y−y′)=(x+y)−(x′+y′)
如果两个绝对值都是负数:(−x+x′)+(−y+y′)=(x′+y′)−(x+y)
如果两个绝对值一正一负:(x−x′)+(−y+y′)=(x−y)−(x′−y′)
如果两个绝对值一负一正:(−x+x′)+(y−y′)=(x′−y′)−(x−y)
然后我们发现可以分成两个分支
- x + y
- x - y
然后就简单了:
献上代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,max1,max2,min1,min2;
int a[500050];
int main(){
int n,s;
cin>>n;
for(int i = 1;i <= n;i ++){
int x,y;
cin>>x>>y;
if(i == 1){
max1 = min1 = x + y;
max2 = min2 = x - y;
}
max1 = max(x + y,max1);
max2 = max(x - y,max2);
min1 = min(x + y,min1);
min2 = min(x - y,min2);
}
cout<<max(max1 - min1,max2 - min2);
return 0;
}
此代码有防抄袭!