AtCoder Beginner Contest 130 F Minimum Bounding Box 三分法求极值(WA)

 题意:给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\n",calc(l));
39     return 0;
40 }

 

转载于:https://www.cnblogs.com/clno1/p/11222380.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值