题意:给n个点的起始坐标以及他们的行走方向,每一单位时间每个点往它的方向移动一单位。问最小能包围所有点的矩形。
解法:看到题目求极值,想了想好像可以用三分法求极值,虽然我也不能证明面积是个单峰函数。
尝试交了一发结果73组数据WA了1组数据,看起来似乎三分法是对的,但是至今还没找到哪个细节错了qwq,先记录下来。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 const int INF=0x3f3f3f3f; 5 const double eps=1e-16; 6 int n,m,x[N],y[N]; 7 char d[N][3]; 8 9 double xmax,xmin,ymax,ymin; 10 void chg(double x,double y) { 11 xmax=max(xmax,x); xmin=min(xmin,x); 12 ymax=max(ymax,y); ymin=min(ymin,y); 13 } 14 15 double calc(double t) { 16 xmax=-INF,xmin=INF,ymax=-INF,ymin=INF; 17 for (int i=1;i<=n;i++) { 18 if (d[i][0]=='R') chg(x[i]+t,y[i]); 19 if (d[i][0]=='L') chg(x[i]-t,y[i]); 20 if (d[i][0]=='U') chg(x[i],y[i]+t); 21 if (d[i][0]=='D') chg(x[i],y[i]-t); 22 } 23 return (double)(xmax-xmin)*(ymax-ymin); 24 } 25 26 int main() 27 { 28 cin>>n; 29 for (int i=1;i<=n;i++) scanf("%d%d%s",&x[i],&y[i],d[i]); 30 double l=0,r=1e8, lm, rm; 31 while(r-l>eps) { 32 lm = l+(r-l)/2; 33 rm = lm+(r-lm)/2; 34 if(calc(lm) < calc(rm)) r = rm; 35 else if(calc(lm) == calc(rm)) r=rm, l=lm; 36 else l = lm; 37 } 38 printf("%.10lf ",calc(l)); 39 return 0; 40 }