【HDU 5973 && 51nod 1185】【威佐夫博弈+大数】

HDU5973 传送门:http://acm.split.hdu.edu.cn/showproblem.php?pid=5973

题意:有2堆石子。两个人轮流拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设两个人都按照最优的策略取石子。给出2堆石子的数量,问先手是否能赢得比赛。 每堆石子的大小≤10^100。 


思路:

对于a,b(a


代码:

import java.math.BigDecimal;
import java.util.Scanner; 

public class Main{
	public static void main(String[] args){
		BigDecimal two=new BigDecimal(2);
		BigDecimal three=new BigDecimal(3);
		BigDecimal five=new BigDecimal(5);
		
		//二分求sqrt(5)
		BigDecimal l=two, r=three;
		for(int i=0; i<500; i++){
			BigDecimal mid=l.add(r).divide(two);
			if(mid.multiply(mid).compareTo(five)<0)
				l=mid;
			else r=mid;
		}
		
		BigDecimal gold=l.add(BigDecimal.ONE).divide(two);
		
		BigDecimal a, b;
		Scanner cin=new Scanner(System.in);
		
		while(cin.hasNext()){
			a=cin.nextBigDecimal();
			b=cin.nextBigDecimal();
			if(a.compareTo(b)>0){//保证a<=b
				BigDecimal tmp=a;
				a=b;
				b=tmp;
			}
			//向下取整,统一精度
			a=a.setScale(0, BigDecimal.ROUND_DOWN);
			b=b.subtract(a).multiply(gold);
			b=b.setScale(0, BigDecimal.ROUND_DOWN);
			if(a.compareTo(b)==0) System.out.println("0");
			else System.out.println("1");
		}
	}
}


51nod 1185传送门:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1185

思路:这题范围是10^18,不过需要多组输入


代码:

import java.math.BigDecimal;
import java.util.Scanner; 

public class Main{
	public static void main(String[] args){
		BigDecimal two=new BigDecimal(2);
		BigDecimal three=new BigDecimal(3);
		BigDecimal five=new BigDecimal(5);
		
		//二分求sqrt(5)
		BigDecimal l=two, r=three;
		for(int i=0; i<75; i++){
			BigDecimal mid=l.add(r).divide(two);
			if(mid.multiply(mid).compareTo(five)<0)
				l=mid;
			else r=mid;
		}
		
		BigDecimal gold=l.add(BigDecimal.ONE).divide(two);
		
		BigDecimal a, b;
		Scanner cin=new Scanner(System.in);
		int T;
		T=cin.nextInt();
		
		while ((T --) != 0){
			a=cin.nextBigDecimal();
			b=cin.nextBigDecimal();
			if(a.compareTo(b)>0){//保证a<=b
				BigDecimal tmp=a;
				a=b;
				b=tmp;
			}
			//向下取整,统一精度
			a=a.setScale(0, BigDecimal.ROUND_DOWN);
			b=b.subtract(a).multiply(gold);
			b=b.setScale(0, BigDecimal.ROUND_DOWN);
			if(a.compareTo(b)==0) System.out.println("B");
			else System.out.println("A");
		}
	}
}





你可能感兴趣的:(------博弈论,online,judge,HDU,51nod,------高精度)