마늘 군 학 대수 (2 점)

제목 링크:https://www.jisuanke.com/course/615/28897
제목 나누다 \|A-B\|∥A−B∥ 행렬 의 범례, 즉 답, 그러면 대응 하 는 것 이다. 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
",ans); }

\|A-B\|

좋은 웹페이지 즐겨찾기