zoukankan      html  css  js  c++  java
  • bzoj 2852: 强大的区间 辗转相除

    2852: 强大的区间

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 45  Solved: 12
    [Submit][Status][Discuss]

    Description

    curimit很喜欢区间,最近发现了一种很强大的区间。
    curimit发现有的区间虽小,比如 (1.99998, 2.000001),但是其中却包含了一个整数2。
    但是有的区间较大,比如(1.0001, 1.99998),但是其中却一个整数都没有。
    他觉得包含整数的区间很强大,并且提出了一个问题:
    我们先给出两个非负实数a,b我们要求一个最小的正整数k ,使得区间(a*k, b*k)是一个包含至少一个整数的区间。
    举个例子来说吧,比如我们输入a=1.2   b=1.3 ,那么:
    当k=1时, 区间为(1.2 , 1.3)  其中没有整数;
    当k=2时, 区间为(2.4 , 2.6)  其中没有整数;
    当k=3时, 区间为(3.6 , 3.9)  其中没有整数;
    当k=4时, 区间为(4.8 , 5.2)  其中包含了一个整数5。
    所以使得区间(1.2*k, 1.3*k)包含一个整数的最小正整数k是4。

    Input

    两个非负实数a,b。

    Output


    最小的k的值。

    Sample Input

    1.2 1.3

    Sample Output

    4

    Hint

    HINT

    a,b整数部分不超过2^31-1,a,b小数部分位数不超过300位。

    这样的题还是很好耍的。首先(a,b)与(a-1,b-1)答案相同,所以保证a<1,若此时b>=0,return 1,否则假设答案为k,中间的数为t,那么我们可以吧原来的范围限定t的式子【a*k<=t<=b*k】化成限定k的【t/b<=k<=t/a】,然后发现就是一个子问题啦。

    话说我这个真的是辗转相除吗,我看网上的程序还用了gcd的。。。。

    import java.util.*;
    import java.math.*;
    
    public class b2852
    {
            static BigDecimal solve(BigDecimal a,BigDecimal b)
            {
                    BigDecimal c;
                    c=a;
                    c=c.setScale(0,BigDecimal.ROUND_DOWN);
                    a=a.subtract(c);
                    b=b.subtract(c);
                    //System.out.println(a.toString());
                    //System.out.println(b.toString());
                    if (b.compareTo(BigDecimal.ONE)>=0)
                            return BigDecimal.ONE;
                    b=BigDecimal.ONE.divide(b,1000,BigDecimal.ROUND_HALF_UP);
                    a=BigDecimal.ONE.divide(a,1000,BigDecimal.ROUND_HALF_UP);
                    BigDecimal t=solve(b,a);
                    b=b.multiply(t);
                    return b.setScale(0,BigDecimal.ROUND_UP);
            }
            public static void main(String[] args)
            {
                    Scanner in=new Scanner(System.in);
                    BigDecimal a=in.nextBigDecimal();
                    BigDecimal b=in.nextBigDecimal();
                    a.setScale(1000,BigDecimal.ROUND_HALF_UP);
                    b.setScale(1000,BigDecimal.ROUND_HALF_UP);
                    System.out.println(solve(a,b).toString());
            }
    };
  • 相关阅读:
    Mysql表连接查询
    mysql查询语句 和 多表关联查询 以及 子查询
    MySql 模糊查询、范围查询
    Mysql外键约束设置使用方法
    python基础:re模块匹配时贪婪和非贪婪模式
    解决Ubuntu 16.04下提示boot分区空间不足的办法
    String,StringBuffer,StringBuilder的区别
    多线程模拟生产者和消费者模型
    线程同步处理
    多线程的三种实现
  • 原文地址:https://www.cnblogs.com/mhy12345/p/4516768.html
Copyright © 2011-2022 走看看