重慶OI2018 九連環

問題 H: 九連環

時間限制: 1 Sec  內存限制: 128 MB

題目描述

九連環是一種源於中國的傳統智力遊戲。如圖所示,九個圓環套在一把“劍”上,並且互相牽連。遊戲的目標是把九個圓環從“劍”上卸下。

圓環的裝卸需要遵守兩個規則。
第一個(最右邊)環任何時候都可以裝上或卸下。
如果第k個環沒有被卸下,且第k個環右邊的所有環都被卸下,則第k+1個環(第k個環左邊相鄰的環)可以任意裝上或卸下。
與魔方的千變萬化不同,解九連環的最優策略是唯一的。爲簡單起見,我們以“四連環”爲例,演示這一過程。這裏用1表示環在“劍”上,0表示環已經卸下。
初始狀態爲1111,每部的操作如下:
1101(根據規則2,卸下第2個環)
1100(根據規則1,卸下第1個環)
0100(根據規則2,卸下第4個環)
0101(根據規則1,裝上第1個環)
0111(根據規則2,裝上第2個環)
0110(根據規則1,卸下第1個環)
0010(根據規則2,卸下第3個環)
0011(根據規則1,裝上第1個環)
0001(根據規則2,卸下第2個環)
0000(根據規則1,卸下第1個環)
由此可見,卸下“四連環”至少需要10步。隨着環數增加,需要的步數也會隨之增多。例如卸下九連環,就至少需要341步。
請你計算,有n個環的情況下,按照規則,全部卸下至少需要多少步。

輸入

輸入第一行爲一個整數m ,表示測試點數目。
接下來m行,每行一個整數n。

輸出

輸出共m行,對應每個測試點的計算結果。

 

思路:https://blog.csdn.net/kuronekonano/article/details/81490009(cls nb!!!!!!!!!!!!!!!!)

代碼:

import java.io.*;
import java.util.*;
import java.math.*;
 
public class Main{
    public static void main(String args[]){
        Scanner cin=new Scanner(System.in);
        int  t;
        t=cin.nextInt();
        while(t>0){
            int a;
            a=cin.nextInt();
            int ou=1;
            if(a%2==0){
                a=a;
                ou=0;
            } 
            else {
                a=a+1;
            }
            BigInteger b;
            BigInteger c;
            b=BigInteger.valueOf(1);
            c=BigInteger.valueOf(2);
            while(a>0){
                if(a%2==1) b=b.multiply(c);
                c=c.multiply(c);
                a=a/2;
            }
            BigInteger www;
            www=BigInteger.valueOf(1);
            BigInteger ww;
            ww=BigInteger.valueOf(3);
            b=b.subtract(www);
            b=b.divide(ww);
            BigInteger w;
            w=BigInteger.valueOf(2);
             
            if(ou==0)  b=b.multiply(w);
            System.out.println(b);
            t=t-1;
        }
         
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章