HDU - 5973 威佐夫博弈+高精度

HDU - 5973 

裸的威佐夫博弈,这题的关键是数据范围达到了10的100次方,所以要用java写。

威佐夫博弈结论:如果开始时两堆物品的数目分别为x和y,不妨设x<y,令z=y-x,记w=(int) ( (sqrt(5)+1)/2) * z ) )(向下取整)。若w等于x,则先手必败,否则先手必胜。

所以这个题只要算出sqrt(5)就行了,需要把sqrt(5)精确到几百位,然后算出w,然后判断 w-x<eps&&w-x>=-eps ,eps=1e-300 是否成立就行了。

计算sqrt(5)精确到几百位代码:

package test20190809;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class test1 {

	private static Scanner sc;
	static Scanner cin=new Scanner(System.in);
	public static void main(String[] args) {
		BigDecimal ans;
		//先给定l和r的值,l*l<=5&&r*r>5,然后二分
        BigDecimal l=BigDecimal.valueOf(2),r=BigDecimal.valueOf(3);
        for(int i=0;i<100;i++)	//循环次数决定了精确到小数点后多少位 
        {
        	//每次二分
            BigDecimal m=l.add(r).divide(BigDecimal.valueOf(2));
            if(m.multiply(m).compareTo(BigDecimal.valueOf(5))<0)
            	l=m;
            else
            	r=m;
        }
        ans=l.add(r).divide(BigDecimal.valueOf(2));
        System.out.println(ans.toString());
//输出结果:
//2.23606797749978969640917366873118464512869304831445180678744892588394321819578181020915508270263671875
	}
	
}

ACcode:

//package test20190809;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    private static Scanner sc;
    static Scanner cin=new Scanner(System.in);
    static BigDecimal sqr=new BigDecimal ("1.61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748475408807538689175212663386222353693179318006076672635443338908659593958290563832266131992829026788067520876689250171169620703222104321626954862629631361443814975870122034080588795445474924618569536486444924104432077134494704956584678850987433944221254487706647809158846074998871240076521705751797883416625624940758906970400028121042762177111");
    static BigDecimal eps=new BigDecimal ("0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001");
    static BigDecimal epss=new BigDecimal ("-0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001");
    public static void main(String[] args) {
        BigDecimal a,b;
        while(cin.hasNext())
        {
            a=cin.nextBigDecimal();
            b=cin.nextBigDecimal();
            BigDecimal c;
            if(a.compareTo(b)>0)
                {c=a;a=b;b=c;}
            BigDecimal ans=sqr.multiply(b.subtract(a));
            BigDecimal anss=ans.setScale(0,BigDecimal.ROUND_FLOOR);
            if(anss.subtract(a).compareTo(eps)<=0&&anss.subtract(a).compareTo(epss)>=0)
                System.out.println("0");
            else
                System.out.println("1");
        }
        
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值