【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");
}
}
}
题意:有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");
}
}
}
相关文章推荐
- HDU 5973 Game of Taking Stones 威佐夫博弈+大数
- hdu 5973 大数威佐夫博弈
- HDU-5973 威佐夫博弈+大数
- 51nod 1185 威佐夫游戏 V2 (博弈+大数乘法模拟)
- HDU 5973Game of Taking Stones 51nod 1185 威佐夫游戏 V2(威佐夫博弈)
- [威佐夫博弈 黄金分割比 数学技巧] POJ 1067 取石子游戏 & HDU 1527 取石子游戏
- HDU-5973 Game of Taking Stones(威佐夫博弈+高精度)(C++高精度)
- 51NOD 1185 威佐夫游戏 V2(大数运算 JAVA 模板)
- 51nod--1185 威佐夫游戏 V2 (博弈, 乘法模拟)
- 51NOD 1185 威佐夫游戏 V2(威佐夫博弈)
- 51Nod 1185 威佐夫游戏 V2 (威佐夫博弈)
- HDU 5973 Game of Taking Stones (威佐夫博弈+高精度)
- 威佐夫博弈hdu 1527 && hdu 2177
- HDU 5973 威佐夫博弈+JAVA高精度
- 51nod 1185 || 51nod 1072 威佐夫博弈
- 51nod 1185 威佐夫游戏 V2(威佐夫博弈)
- HDU 5973-Game of Taking Stones(威佐夫博弈-JAVA BigDecimal)
- 51nod 1185 威佐夫游戏 V2 (用乘法模拟解决大数精度问题)
- HDU - 5973 HDU - 5973 威佐夫博弈,高精度BigDecimal
- HDU 5973-Game of Taking Stones(威佐夫博弈