1. 程式人生 > >【HDOJ5973】Game of Taking Stones(Java,威佐夫博弈)

【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 }