题解:AT_abc130_f [ABC130F] Minimum Bounding Box
题意
平面上有
- 如果
d_i=R ,第i 个点沿x 轴正方向移动; - 如果
d_i=L ,第i 个点沿x 轴负方向移动; - 如果
d_i=U ,第i 个点沿y 轴正方向移动; - 如果
d_i=D ,第i 个点沿y 轴负方向移动;
找出
思路
令
不会三分法点这里
代码
#include <bits/stdc++.h>
using namespace std;
long long n;
long double dx[100007],dy[100007];
char f[100007][2];
long double check(long double tim)//计算给定时间mid下的面积值。
{
long double xx=-1e18,xn=1e18,yx=-1e18,yn=1e18;
for (long long i=1;i<=n;i++)
{
long double x=dx[i],y=dy[i];
if(f[i][0]=='U')y+=tim;
if(f[i][0]=='D')y-=tim;
if(f[i][0]=='L')x-=tim;
if(f[i][0]=='R')x+=tim;
xx=max(xx,x),xn=min(xn,x),yx=max(yx,y),yn=min(yn,y);
}
return (xx-xn)*(yx-yn);
}
int main() {
scanf("%lld",&n);
for(long long i=1;i<=n;i++)
scanf("%Lf%Lf%s",&dx[i],&dy[i],f[i]);//注意要用 %Lf 不然精度不够。
//三分法
long double l=0,r=2e8,midl=0,midr=0;
for(long long i=0;i<500;i++)
{
midl=(l*2+r)/3,midr=(l+r*2)/3;
if(check(midl)<check(midr)) r=midr;
else l=midl;
}
printf("%.2Lf",check(midl));
return 0;
}