专栏文章
题解:B4253 [科大国创杯小学组 2024] 几何
B4253题解参与者 1已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mipvi60d
- 此快照首次捕获于
- 2025/12/03 18:37 3 个月前
- 此快照最后确认于
- 2025/12/03 18:37 3 个月前
题意:
让我们写出欧几里得距离或曼哈顿距离的最大值
思路
30分思路:用两个双层循环暴力,计算欧几里得距离或曼哈顿距离,再取最大值,输出最大值。
缺陷:时间复杂度为 , ,会超时,且计算欧几里得距离时,用 函数会浮点数误差。
改进:
将 替换。
50分思路:
和30分思路没有太大差别,只是把 函数改成了* 。
缺陷:
时间复杂度为 ,会超时。
改进:
把计算曼哈顿距离的函数的时间复杂度降至 。
100分思路:
对于曼哈顿距离 ,可以根据绝对值的性质进行展开:
- 当 且 时,
- 当 且 时, 。
- 当 且 时, 。
- 当 且 时,
因此,我们只需要分别找出
的最大值和最小值,然后计算它们之间的最大差值,即可得到最大曼哈顿距离。
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,op;
int x[N],y[N];
long long maxn=-0x3f3f3f3f;
int main(){
cin>>n>>op;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
if(op==1){
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
long long road=1LL*(x[i]-x[j])*(x[i]-x[j])+1LL*(y[i]-y[j])*(y[i]-y[j]);
maxn=max(maxn, road);
}
}
}else{
long long max1=-1e18,min1=1e18;
long long max2=-1e18,min2=1e18;
long long max3=-1e18,min3=1e18;
long long max4=-1e18,min4=1e18;
for(int i=1;i<=n;i++){
max1=max(max1,1LL*x[i]+y[i]);
min1=min(min1,1LL*x[i]+y[i]);
max2=max(max2,1LL*x[i]-y[i]);
min2=min(min2,1LL*x[i]-y[i]);
max3=max(max3,1LL*(-x[i])+y[i]);
min3=min(min3,1LL*(-x[i])+y[i]);
max4=max(max4,1LL*(-x[i])-y[i]);
min4=min(min4,1LL*(-x[i])-y[i]);
}
maxn=max({max1-min1,max2-min2,max3-min3,max4-min4});
}
cout<<maxn;
return 0;
}
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...