又学会了二分的新用法,
其实二分可以设置固定的二分次数作为跳出条件,当次数达到一定时,一定可以的到解,可以解决因精度而T的情况。
向群神致敬。
题目:http://codeforces.com/contest/549/problem/H
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const double eps = 1e-9;
double t1[10],t2[10];
struct pp{
double a,b;
}p[2];
int main(){
double a,b,c,d;
double high = 2*1e9,low = 0;
cin>>a>>b>>c>>d;
int co = 0;
while(co <= 80){
co++;
double mid = (high+low)/2;
double a1=a+mid , a2 = a-mid;
double b1=b+mid , b2 = b-mid;
double c1=c+mid , c2 = c-mid;
double d1=d+mid , d2 = d-mid;
t1[1] = a1*d1;t1[2]=a1*d2;t1[3]=a2*d1;t1[4]=a2*d2;
t2[1] = c1*b1;t2[2]=c1*b2;t2[3]=c2*b1;t2[4]=c2*b2;
sort(t1+1,t1+5);
sort(t2+1,t2+5);
p[0].a = t1[1],p[0].b=t1[4];
p[1].a = t2[1],p[1].b=t2[4];
if(p[0].a > p[1].a){
pp tmp = p[1];
p[1] = p[0];
p[0] = tmp;
}
int fl=0;
if(p[0].b >= p[1].a) fl=1;
if(fl==1) high = mid;
else low = mid;
}
// cout<<"hehe\n";
printf("%.10f\n",low);
return 0;
}