思路
很明显,alex在的位置肯定是bob的位置,因为这样形成的夹角才最大。
然后枚举相邻的点,求一下之间的距离即可。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int man = 2e5+10;
#define IOS ios::sync_with_stdio(0)
#define ull unsigned ll
#define uint unsigned
#define pai pair<int,int>
#define pal pair<ll,ll>
#define IT iterator
#define pb push_back
#define fi first
#define se second
#define For(i,j,k) for (int i=(int)(j);i<=(int)(k);++i)
#define Rep(i,j,k) for (int i=(int)(j);i>=(int)(k);--i)
#define endl '\n'
#define ll long long
const ll mod = 1e9+7;
int x,y,w,h;
double a[6],d[man];
double get_d(pai a){
return atan2(a.second-y,a.first-x);
}
double pi = acos(-1);
double get(double d){
double ans = 0;
if(d>=a[1]&&d<a[2]){
if(d<=-pi/2.0)ans = x - tan(fabs(d+pi/2.0))*y;
else ans = x + tan(fabs(pi/2.0+d))*y;
}else if(d>=a[2]&&d<a[3]){
ans = w + y;
if(d<=0)ans -= tan(fabs(d))*(w-x);
else ans += tan(d)*(w-x);
}else if(d>=a[3]&&d<a[4]){
ans = w + h + w - x;
if(d<=pi/2.0)ans -= tan(pi/2.0-d)*(h-y);
else ans += tan(d - pi/2.0)*(h-y);
}else if(d>=a[4]||d<a[1]){
ans = 2.0*w + h;
if(d>=a[4])ans += h - y - tan(pi-d)*x;
else ans += h - y + tan(pi+d)*x;
}
return ans;
}
signed main() {
#ifndef ONLINE_JUDGE
//freopen("in.txt", "r", stdin);
//freopen("out.txt","w",stdout);
#endif
int t,T = 0;
scanf("%d",&t);
while(t--){
int n;
scanf("%d%d",&w,&h);
scanf("%d%d",&x,&y);
scanf("%d",&n);
a[1] = get_d(make_pair(0,0));
a[2] = get_d(make_pair(w,0));
a[3] = get_d(make_pair(w,h));
a[4] = get_d(make_pair(0,h));
// for(int i = 1;i <= 4;++i){
// cout<<a[i]<<endl;
// }
for(int i = 1;i <= n;++i){
pai tp;
scanf("%d%d",&tp.first,&tp.second);
d[i] = get(get_d(tp));
//cout<<"i:"<<i<<" "<< d[i]<<endl;
}
sort(d+1,d+1+n);
double ans = 2.0*(w+h);
ans -= (d[n] - d[1]);
for(int i = 2;i <= n;++i){
ans = max(ans,d[i] - d[i-1]);
}
printf("Case #%d: %.8lf\n",++T,ans);
}
return 0;
}