给定 N 个柱子的坐标和高度,让你找到一个最小的四棱锥(斜面和底面夹角为45°),使得全部的柱子都在里面
分析:
因为四棱锥(斜面和底面夹角为45°),所以四棱锥的高=其底面正方形边长的一半,所以只要确定了底面边长就能知道它的高
因此,把柱子高度的限制条件转换成底面边长的限制条件,(已知柱子的坐标与高度,那么底面正方形的中心为(x,y),边长为2h),那么只要找到最小的能包含这n个底面正方形的正方形,就可得到符合条件的四棱锥
所以设所求正方形的四条边分别是
x
l
,
x
r
,
y
l
,
y
r
xl, xr, yl, yr
xl,xr,yl,yr,则显然满足:
x
l
=
min
(
x
i
−
h
i
)
x
r
=
max
(
x
i
+
h
i
)
y
l
=
min
(
y
i
−
h
i
)
y
r
=
max
(
y
i
+
h
i
)
\begin{aligned}xl = &\min( x_i - h_i ) \\xr = &\max( x_i + h_i ) \\yl = &\min( y_i - h_i ) \\yr = &\max( y_i + h_i )\end{aligned}
xl=xr=yl=yr=min(xi−hi)max(xi+hi)min(yi−hi)max(yi+hi)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll INF = 4e18;
int n;
struct zz
{
ll x,y;
ll h;
}a[100009];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y>>a[i].h;
ll xl=INF,yl=INF,xr=-INF,yr=-INF;
for(int i=1;i<=n;i++)
{
xl=min(xl,a[i].x-a[i].h);
xr=max(xr,a[i].x+a[i].h);
yl=min(yl,a[i].y-a[i].h);
yr=max(yr,a[i].y+a[i].h);
}
ll ansx,ansy,ansh;
ansx=(xr+xl)/2;
ansy=(yl+yr)/2;
ansh=(max(xr-xl,yr-yl)+1)/2;
cout<<ansx<<" "<<ansy<<" "<<ansh<<endl;
return 0;
}