zoukankan      html  css  js  c++  java
  • UVA 10254 The Priest Mathematician

    UVA_10254

        如果我们设f[i]为4个柱子时把i个东东从一个柱子移到另一个柱子所用的最少步骤,设g[i]为3个柱子时对应的值,我们可以得到f[n]=min{2*f[k]+g[n-k]},其中g[i]是已知的为2^i-1。

        然后接着就搞不下去了,看了别人报告说要找规律,o(╯□╰)o。有了上面的式子之后,我们打印前60个解还是很好打印的,同时把f[i]-f[i-1]也打印出来,这时会发现f[i]-f[i-1]都是2的某次方,而且2的k次方一共连续出现了k+1次,于是我们就可以以这个特征为依据预处理出所有解了。

    import java.math.BigInteger;
    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner cin = new Scanner(System.in);
    BigInteger[] f = new BigInteger[10010];
    f[0] = new BigInteger("0");
    int k = 1, cnt = 0;
    BigInteger d = new BigInteger("1");
    for(int i = 1; i <= 10000; i ++)
    {
    f[i] = f[i - 1].add(d);
    cnt ++;
    if(cnt == k)
    {
    cnt = 0;
    k ++;
    d = d.multiply(BigInteger.valueOf(2));
    }
    }
    while(cin.hasNext())
    {
    int n = cin.nextInt();
    System.out.println(f[n]);
    }
    }
    }


  • 相关阅读:
    wkhtmktopdf
    linux命令行抓取网页快照
    ubuntu 固定静态IP
    $http questions
    generate_scripts
    network
    IT_Qestion
    day03
    day02
    day01
  • 原文地址:https://www.cnblogs.com/staginner/p/2290692.html
Copyright © 2011-2022 走看看