Time cost:45min
这题还是比较简单的(然后机房就把这个题刷成了AC率100%...)
首先这个题有显然的二分性:小的成立大的一定成立 大的不成立小的一定不成立
观察样例和题意 考虑答案为x的情况 如果我们强制最大化 就是+x或者-x
ad-bc中ad和bc分别有四种情况(+,+)(+,-)(-,+)(-,-)
考虑这些情况的最小值和最大值
如果ad的最大值大于bc的最小值 而且bc的最大值大于ad的最小值
那么就有可能变成ad=bc 就有解 R=mid
否则变化范围就偏小 L=mid
然后由于CF各种玄学的错误 改成cincout 然后setprecision卡精度都不过
最后发现二分最后判断大于的时候加了个eps.....然后凉凉
以后注意只有while判断的时候加eps就好了
Code:
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 #include<cmath>
5 #include <iostream>
6 #include <iomanip>
7 #define ms(a,b) memset(a,b,sizeof a)
8 #define rep(i,a,n) for(int i = a;i <= n;i++)
9 #define per(i,n,a) for(int i = n;i >= a;i--)
10 #define inf 2147483647
11 using namespace std;
12 typedef long long ll;
13 ll read() {
14 ll as = 0,fu = 1;
15 char c = getchar();
16 while(c < '0' || c > '9') {
17 if(c == '-') fu = -1;
18 c = getchar();
19 }
20 while(c >= '0' && c <= '9') {
21 as = as * 10 + c - '0';
22 c = getchar();
23 }
24 return as * fu;
25 }
26 typedef long double D;
27 #define eps (1e-10)
28 #define max(a,b) (((a)>(b))?(a):(b))
29 #define min(a,b) (((a)<(b))?(a):(b))
30 //head
31 D a,b,c,d;
32 D L = 0,R = 1.1e9;
33 D maxx[2],minn[2];
34 bool check(D x) {
35 maxx[0] = max( max((a-x)*(d-x) , (a+x)*(d-x)) , max((a+x)*(d+x) , (a-x)*(d+x)));
36 minn[0] = min( min((a-x)*(d-x) , (a+x)*(d-x)) , min((a+x)*(d+x) , (a-x)*(d+x)));
37 maxx[1] = max( max((b-x)*(c-x) , (b-x)*(c+x)) , max((b+x)*(c+x) , (b+x)*(c-x)));
38 minn[1] = min( min((b-x)*(c-x) , (b-x)*(c+x)) , min((b+x)*(c+x) , (b+x)*(c-x)));
39 if(maxx[0] >= minn[1] && maxx[1] >= minn[0]) return 1;
40 return 0;
41 }
42
43 int main() {
44 cin >> a >> b >> c >> d;
45 while(R - L > eps) {
46 D m = (L+R) / 2.0;
47 check(m) ? R = m : L = m;
48 }
49 cout << setprecision(10) << fixed << L << endl;
50 return 0;
51 }