您的位置:首页 > 其它

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

2016-11-21 21:30 351 查看
HDU5973 传送门:http://acm.split.hdu.edu.cn/showproblem.php?pid=5973

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

思路:

对于a,b(a<b),如果有floor((b-a)*((sqrt(5)+1)/2))==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");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: