1. 程式人生 > >HDU 5973 Aninteresting game 威佐夫博奕(Wythoff Game)

HDU 5973 Aninteresting game 威佐夫博奕(Wythoff Game)

== targe scanner rgs void 威佐夫 pre static div

HDU 5973:http://acm.hdu.edu.cn/showproblem.php?pid=5975

題意:

  有兩堆石子,每次可以從一堆石子中取任意個,或者從兩堆石子中取相同個數的石子。兩個人輪流用這種策略取石子,誰取完所有的石子就算勝利。問先手勝還是後手勝。

思路:

  一模一樣的威佐夫博奕(Wythoff Game),結論的是,假設a>b,那麽如果((1+sqrt(5))* (a - b))/2 == b ,那麽先手必輸。但是這道題的數據比較大,所以需要java做高精度。

技術分享圖片
import javax.swing.*;
import java.util.Scanner;
import java.math.BigDecimal; public class Main{ public static void main(String[] args) { BigDecimal One = new BigDecimal(1); BigDecimal Two = new BigDecimal(2); BigDecimal Five = new BigDecimal(5); // BigDecimal two = new BigDecimal(2); // System.out.println(One.compareTo(Two));
//-1 BigDecimal le = new BigDecimal(2); BigDecimal ri = new BigDecimal(3); BigDecimal mid = le.add(ri).divide(Two); for(int i= 1; i<=400; i++) { mid = le.add(ri).divide(Two); if(mid.multiply(mid).compareTo(Five) == -1 ) { le
= mid; } else ri = mid; } BigDecimal k = (One.add(mid)).divide(Two); //System.out.println(k); Scanner in = new Scanner(System.in); while(in.hasNext()) { BigDecimal a = in.nextBigDecimal(); BigDecimal b = in.nextBigDecimal(); BigDecimal det = new BigDecimal(0); int flag = 1; if(a.compareTo(b) == -1) { det = b.subtract(a); det = det.multiply(k); //long l = bd.setScale( 0, BigDecimal.ROUND_DOWN ).longValue(); // 向下取整 det = det.setScale( 0, BigDecimal.ROUND_DOWN ); if(det.compareTo(a) == 0) { flag = 0; } } else { det = a.subtract(b); det = det.multiply(k); //long l = bd.setScale( 0, BigDecimal.ROUND_DOWN ).longValue(); // 向下取整 det = det.setScale( 0, BigDecimal.ROUND_DOWN ); if(det.compareTo(b) == 0) { flag = 0; } } System.out.println(flag); } } }
HDU 5973

HDU 5973 Aninteresting game 威佐夫博奕(Wythoff Game)