【HDOJ5973】Game of Taking Stones(Java,威佐夫博弈)

思路:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。

游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。

最后把石子全部取完者为胜者。

现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

a,b<=1e100

思路:裸的威佐夫博弈,网上找了一个Java的高精度板子

主要是把黄金分割点用二分精确到小数点后100位

 1 import java.math.BigDecimal;
 2 import java.util.Scanner;
 3 public class Main
 4 {
 5     public static void main(String[] args)
 6     {
 7         BigDecimal two=BigDecimal.valueOf(2);
 8         BigDecimal five=BigDecimal.valueOf(5);
 9         BigDecimal eps= new BigDecimal("-0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001");
10         BigDecimal l=new BigDecimal("2.2360679774997");
11         BigDecimal r=new BigDecimal("2.2360679774998");
12         BigDecimal m=null;
13         while(l.subtract(r).compareTo(eps)<0)
14         {
15             m=l.add(r).divide(two);
16             if(m.multiply(m).subtract(five).abs().compareTo(eps.abs())<0) break;
17             if(m.multiply(m).subtract(five).compareTo(eps)<0) l=m;
18                else r=m;
19         }
20         BigDecimal Gold=m.add(BigDecimal.ONE).divide(two);
21         Scanner sc=new Scanner(System.in);
22         while(sc.hasNext())
23         {
24             BigDecimal a=sc.nextBigDecimal(),b=sc.nextBigDecimal();
25             if(a.compareTo(b)>0)
26             {
27                 BigDecimal t=a;
28                 a=b;
29                 b=t;
30             }
31             BigDecimal c=b.subtract(a).setScale(0,BigDecimal.ROUND_FLOOR).multiply(Gold);
32             c=c.setScale(0,BigDecimal.ROUND_FLOOR);
33             if(a.equals(c)) System.out.println("0");
34              else System.out.println("1");
35         }
36     }
37 }
原文地址:https://www.cnblogs.com/myx12345/p/9989680.html