zoukankan      html  css  js  c++  java
  • 【hdu5973】高精度威佐夫博弈

    题意:输入a, b表示两堆石头数目,威佐夫博弈,问:先手胜负?

    a, b <= 1e100.

    高精度。当a > b时, a = (a-b)*黄金分割比 时是先手败状态。因为a, b <= 1e100,所以黄金分割比至少要保留小数点后100位。

    BigDecimal没有开方操作,所以二分算出黄金分割比。

     1 import java.util.*;
     2 import java.io.BufferedInputStream;
     3 import java.math.*;
     4 public class Main {
     5     public static void main(String[] args){
     6         Scanner cin = new Scanner(new BufferedInputStream(System.in)); 
     7         BigDecimal L = new BigDecimal(1.6180339887), R = new BigDecimal(1.6180339888);
     8         BigDecimal eps = new BigDecimal(0.1).pow(101);
     9         while( R.subtract(L).subtract(eps).compareTo(BigDecimal.ZERO) > 0){
    10             BigDecimal M = L.add(R).divide(BigDecimal.valueOf(2));
    11             BigDecimal ret = M.multiply(BigDecimal.valueOf(2)).subtract(BigDecimal.ONE).pow(2);
    12             if(ret.compareTo(BigDecimal.valueOf(5)) > 0)
    13                 R = M;
    14             else 
    15                 L = M;
    16         }
    17         BigDecimal t = L;//黄金分割数精确到1e-100
    18         while(cin.hasNext()){
    19             BigInteger a = cin.nextBigInteger(), b = cin.nextBigInteger();
    20             int com = a.compareTo(b), ccom = 0;
    21             if(com == 0){
    22                 ccom = a.compareTo(BigInteger.ZERO);
    23                 if(ccom == 0)
    24                     System.out.println(0);
    25                 else 
    26                     System.out.println(1);
    27                 continue ;
    28             }
    29             if(com == -1){
    30                 BigInteger c = a;
    31                 a = b;
    32                 b = c;
    33             }
    34             BigInteger k = a.subtract(b);
    35             BigDecimal kk = new BigDecimal(k).multiply(t).setScale(0,  BigDecimal.ROUND_DOWN);
    36             k = kk.toBigInteger();
    37             ccom = k.compareTo(b);
    38             if(ccom == 0)
    39                 System.out.println(0);
    40             else 
    41                 System.out.println(1);
    42         }
    43     }
    44 }
  • 相关阅读:
    Mybatis 传入的参数为List
    IDEA 自动清除不使用的 引用包
    java List去除重复数据
    oracle 导出数据库报错 EXP-00002: 写入导出文件时出错 EXP-00000: 导出终止失败
    Tomcat修改窗口名
    Oracle忘记密码找回
    3springboot执行原理及自动装配原理
    2springboot第一个程序
    springboot项目有红叉,但是没有运行没有报错。
    1springboot与微服务
  • 原文地址:https://www.cnblogs.com/dirge/p/6039389.html
Copyright © 2011-2022 走看看