HDU 5973Game of Taking Stones 51nod 1185 威佐夫游戏 V2(威佐夫博弈)

思路

威佐夫博弈套公式即可
若b>a则,floor(1.618*(b-a))==a时先手必败
因为精度要求比较高,处理好精度就可以

Java高精度+二分求根号/牛顿法+读入优化

代码

HDU 5973Game of Taking Stones

import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.StringTokenizer;

/*Python..
from decimal import *
getcontext().prec=100
a=Decimal(5).sqrt()
print(a)
//*/
public class Main {

    //getSqrtX(5,-100); 根号5精确到小数点后100位
    public static BigDecimal getSqrtX(double x,int precision){
        BigDecimal l=BigDecimal.ONE,r=BigDecimal.valueOf(x)
                ,val=BigDecimal.valueOf(x),half=BigDecimal.valueOf(0.5);
        BigDecimal eps=BigDecimal.ONE;
        eps=eps.scaleByPowerOfTen(precision);
        while(r.subtract(l).compareTo(eps)>0){
            BigDecimal mid=l.add(r).multiply(half);
            if (mid.multiply(mid).compareTo(val)<0) l=mid;
            else r=mid;
            //System.out.println(mid.toString());
        }
        return l;
    }

    public static BigDecimal getSqrtByNewton(double x,int precision){
        BigDecimal lst=BigDecimal.ONE,val=BigDecimal.valueOf(x)
                ,cur=BigDecimal.valueOf(x),half=BigDecimal.valueOf(0.5);
        BigDecimal eps=BigDecimal.ONE;
        eps=eps.scaleByPowerOfTen(precision);
        while(cur.subtract(lst).abs().compareTo(eps)>0){
            lst=cur;
            cur=(cur.add(val.divide(cur,-precision+1,BigDecimal.ROUND_HALF_UP))).multiply(half);
        }
        return cur;
    }

    public static void main(String[] args) {
        BigDecimal sqrt5=getSqrtX(5,-105);
       // BigDecimal sqrt5=getSqrtByNewton(5,-105);
        sqrt5=sqrt5.add(BigDecimal.ONE).multiply(BigDecimal.valueOf(0.5));
        BigDecimal a,b,t;
        Scanner cin=new Scanner(System.in);


        while(cin.hasNext()){
            a=cin.nextBigDecimal();
            b=cin.nextBigDecimal();
            if (a.compareTo(b)>0){
                t=a; a=b; b=t;
            }
            BigDecimal ans=sqrt5.multiply(b.subtract(a));
            ans=ans.setScale(0,BigDecimal.ROUND_FLOOR);
            if (ans.compareTo(a)==0) System.out.println("0");
            else System.out.println("1");
        }
    }
}

51nod 1185 威佐夫游戏 V2

import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.StringTokenizer;

/*Python..
from decimal import *
getcontext().prec=100
a=Decimal(5).sqrt()
print(a)
//*/
public class Main {

    //getSqrtX(5,-100); 根号5精确到小数点后100位
    public static BigDecimal getSqrtX(double x,int precision){
        BigDecimal l=BigDecimal.ONE,r=BigDecimal.valueOf(x)
                ,val=BigDecimal.valueOf(x),half=BigDecimal.valueOf(0.5);
        BigDecimal eps=BigDecimal.ONE;
        eps=eps.scaleByPowerOfTen(precision);
        while(r.subtract(l).compareTo(eps)>0){
            BigDecimal mid=l.add(r).multiply(half);
            if (mid.multiply(mid).compareTo(val)<0) l=mid;
            else r=mid;
            //System.out.println(mid.toString());
        }
        return l;
    }

    public static BigDecimal getSqrtByNewton(double x,int precision){
        BigDecimal lst=BigDecimal.ONE,val=BigDecimal.valueOf(x)
                ,cur=BigDecimal.valueOf(x),half=BigDecimal.valueOf(0.5);
        BigDecimal eps=BigDecimal.ONE;
        eps=eps.scaleByPowerOfTen(precision);
        while(cur.subtract(lst).abs().compareTo(eps)>0){
            lst=cur;
            cur=(cur.add(val.divide(cur,-precision+1,BigDecimal.ROUND_HALF_UP))).multiply(half);
        }
        return cur;
    }

    public static void main(String[] args) {
     //   BigDecimal sqrt5=getSqrtX(5,-105);
        BigDecimal sqrt5=getSqrtByNewton(5,-105);
        sqrt5=sqrt5.add(BigDecimal.ONE).multiply(BigDecimal.valueOf(0.5));
        BigDecimal a,b,t;
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        PrintWriter out = new PrintWriter(outputStream);

        int T; T=in.nextInt();
        while(T>0){
            a=in.nextBigDecimal();
            b=in.nextBigDecimal();
            if (a.compareTo(b)>0){
                t=a; a=b; b=t;
            }
            BigDecimal ans=sqrt5.multiply(b.subtract(a));
            ans=ans.setScale(0,BigDecimal.ROUND_FLOOR);
            if (ans.compareTo(a)==0) out.println("B");
            else out.println("A");
            T--;
        }
        out.flush();
        out.close();
    }

    static class InputReader {
        public BufferedReader reader;
        public StringTokenizer tokenizer;
        public InputReader(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }
        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }
        public int nextInt() {
            return Integer.parseInt(next());
        }
        public double nextDouble(){
            return Double.parseDouble(next());
        }
        public BigInteger nextBigInteger(){
            return new BigInteger(next());
        }
        public BigDecimal nextBigDecimal(){
            return new BigDecimal(next());
        }
        public String nextString(){
            return next();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值