蒜头君学代数(二分)

题目链接:https://www.jisuanke.com/course/615/28897

题目思路:2 分 \|A-B\|AB 矩阵范数,即答案,那么对应的 BB 矩阵的每个元素都可以确定在某个区间范围内,然后根据这些区间范围判断是否能构造出一个奇异矩阵。

坑点:为了避免精度问题采用循环的方法求解,一开始的check函数写的不对,采用四个循环的方法,求解出行列式的最大值和最小值,如果满足零点存在定理就满足题目所要求的条件

代码:

#include
using namespace std;
const double inf = 1e9;
double a,b,c,d;

bool check(double mid)
{
	double mmin=inf,mmax=-inf;
    double a1[2]={a+mid,a-mid},b1[2]={b+mid,b-mid},c1[2]={c+mid,c-mid},d1[2]={d+mid,d-mid};
    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
    for(int k=0;k<2;k++)
    for(int l=0;l<2;l++){
    	if(a1[i]*d1[l]-b1[j]*c1[k]>=mmax) mmax=a1[i]*d1[l]-b1[j]*c1[k];
    	if(a1[i]*d1[l]-b1[j]*c1[k]<=mmin) mmin=a1[i]*d1[l]-b1[j]*c1[k];
    }

    if(mmax*mmin<=0) return true;
    else return false;
}
int main()
{
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    double l=0,r=inf,mid;
    double ans;
    for(int i=0;i<50;i++){
        mid=(l+r)/2;
        if(check(mid)){
            r=mid;
            ans=mid;
        }
        else{
            l=mid;
        }
    }
    printf("%f\n",ans);
}


\|A-B\|

你可能感兴趣的:(数据结构--二分)