蒜头君学代数(二分)

来源:互联网 发布:qt5串口编程详解 编辑:程序博客网 时间:2024/05/16 23:38

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

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

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

代码:

#include<bits/stdc++.h>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\|