CF549H:Degenerate Matrix ——题解
https://vjudge.net/problem/CodeForces-549H
————————————————————————
题目大意:给一个矩阵,每个数可以加任意的数使得该矩阵为退化矩阵(ad-bc=0),求每个数加的数的绝对值最大的最小值。
————————————————————————————
这题坑在看不懂题……
题解参考这个:http://blog.csdn.net/qq_26122039/article/details/53120339
这里再重新叙述一下吧:
首先二分最大值mid,这样每个数都可以最大上下浮动mid。
我们求出来这种情况下ad和bc的取值范围,只要他们的取值范围相交,就一定能达到条件。
——————————————————————————————
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<iostream> using namespace std; const int M=10005; double ans,a,b,c,d; bool pan(double m){ double a1=a+m;double a2=a-m;double b1=b+m;double b2=b-m; double c1=c+m;double c2=c-m;double d1=d+m;double d2=d-m; double t1=min(min(a1*d1,a1*d2),min(a2*d1,a2*d2)); double t2=min(min(b1*c1,b1*c2),min(b2*c1,b2*c2)); double x1=max(max(a1*d1,a1*d2),max(a2*d1,a2*d2)); double x2=max(max(b1*c1,b1*c2),max(b2*c1,b2*c2)); if(t1<=x2&&t2<=x1)return 0; return 1; } void erfen(double l,double r){ for(int i=1;i<=100;i++){ double mid=(l+r)/2; if(pan(mid))ans=l=mid; else r=mid; } return; } int main(){ cin>>a>>b>>c>>d; erfen(0,1e9); printf("%.10lf\n",ans); return 0; }