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;
}

 

posted @ 2017-12-08 15:39  luyouqi233  阅读(282)  评论(0编辑  收藏  举报