• Jzoj4626 矩阵


    先声明:本人在OJ上并没有AC但是坚信是spj错了因为我下载了数据本地评测而且交了一个直接输出答案的程序

    这个题目思路比较奇怪,题解我也没有看懂,这里提供一种三分的方法

    我们假设这个B的表达式为[a±x,b±x][c±x,d±x]

    那么显然答案就是x

    我们先暴力枚举正负号(二进制法),让后对于每一种情况,我们用三分法求B使得B的行列式绝对值尽量小,若这个值小余一个极小的量(我原来用的是1e-3,不过发现即使是1也可以在本地通过所有数据),我们就接受这个答案,这样在2^4=16种情况中,去最小的一个即为正确答案

    如果本算法有人发现问题欢迎构造数据来hack!

    #include<stdio.h>
    #include<math.h>
    #define D double
    inline void swap(int& a,int& b){ a^=b;b^=a;a^=b; }
    int a,b,c,d; D ans=1e100,mcal=1e100;
    D cal(int typ,D x){
    	D _a=a+x*(typ&(1<<0)?-1:1);
    	D _b=b+x*(typ&(1<<1)?-1:1);
    	D _c=c+x*(typ&(1<<2)?-1:1);
    	D _d=d+x*(typ&(1<<3)?-1:1);
    	return fabs(_a*_d-_b*_c);
    }
    double dijk(int typ){
    	D l=-1e10,r=1e10;
    	for(D m1,m2;r-l>1e-5;){
    		m1=l+(r-l)/3.;
    		m2=l+(r-l)/1.5;
    		if(cal(typ,m1)>cal(typ,m2)) l=m1; else r=m2;
    	}
    	if(fabs(cal(typ,l))<1&&fabs(l)<fabs(ans)) ans=l;
    	//printf("%d:%lf:%lf
    ",typ,l,cal(typ,l));
    }
    int main(){
    	scanf("%d%d%d%d",&a,&b,&c,&d);
    	if(a>d) swap(a,d); 
    	if(b>c) swap(b,c);
    	if(c>d) { swap(a,b); swap(c,d); }
    	for(int i=0;i<16;++i) 
    		dijk(i);
    	printf("%.6lf
    ",fabs(ans));
    }

  • 相关阅读:
    火狐firefox进行post提交测试
    spring cloud:config-eureka-refresh
    spring cloud:config
    使用Docker部署Gitlab
    Docker配置加速器
    spring cloud:eureka
    Sql Server 出现此数据库没有有效所有者问题
    将VS2012的项目转化成VS2010
    SQL Server 2008将数据库数据导出到脚本
    Sql Server 显示插入Identity字段
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477315.html
Copyright © 2020-2023  润新知