數論 NOIP2007 Hanoi雙塔問題

2021-07-30 19:34:46 字數 1964 閱讀 7659

前幾天z老師給我們把歷年noip普及組的數論題都找了出來 說真的 目前對於高精度還一竅不通的我 有些題真心不會 但是最後看看**才發現 我基本上都沒用到高精..

例如這個題 正解確實要用高精 但是我還是沒有..我的做法已經在洛谷oj發布了題解

題目

hanoi雙塔問題【noip普及組】2007t4 [難度]普及組題目不評級 [標籤]《高精》《遞推》《遞迴》《數論數學》 (洛谷搜尋p1096 1s128mb)

hanoi雙塔問題

要點:首先要建立遞推關係式

題目描述

給定a、b、c三根足夠長的細柱,在a柱上放有2n個中間有孔的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的(下圖為n=3的情形)。

現要將這些圓盤移到c柱上,在移動過程中可放在b柱上暫存。要求:

(1)每次只能移動乙個圓盤;

(2)a、b、c三根細柱上的圓盤都要保持上小下大的順序;

任務:設an為2n個圓盤完成上述任務所需的最少移動次數,對於輸入的n,輸出an。

輸入輸出格式

輸入格式:

輸入檔案hanoi.in為乙個正整數n,表示在a柱上放有2n個圓盤。

輸出格式:

輸出檔案hanoi.out僅一行,包含乙個正整數, 為完成上述任務所需的最少移動次數an。

輸入輸出樣例

輸入樣例:① 1 ②2

輸出樣例:① 2 ②6

說明

【限制】

對於50%的資料,1<=n<=25

對於100%的資料,1<=n<=200 //這麼小 暴力就是了[滑稽

我們可以用乙個num陣列來儲存答案且num[1]代表個位 往後類推

#include

using

namespace

std;

#define size 100001

int num[size];

int n,len=1;

//coyg

n是我們要輸入的數字 len代表輸出答案的長度 首先要初始化

num[1]=1;

一定要注意 不要把num[1]初始為2 往後看你就會明白

然後就是記錄移動

for(int i=1;i<=n;i++)

這裡我們需要弄乙個函式record來記錄

void record()

else}}

}//coyg

呼叫了n次之後 我們好像已經計算出了n個塔移動的次數 但是如果我們此時輸入 3 輸出的答案應該是7 可卻是8

原因是之前我們個位多加了一次 於是

num[1]-=1;

然後再執行一遍record獲得2n的數量

最後倒敘輸出

全**如下

#include

using

namespace

std;

#define size 100001

int num[size];

int n,len=1;

void record()

else}}

}int main()

for(int i=len;i>=1;i--)

差不多就這樣 當然普及組的題很簡單 如果是提高組的數論那麼就要…

好好看書學數學!

一起共勉

數論 NOIP2007 Hanoi雙塔問題

前幾天z老師給我們把歷年noip普及組的數論題都找了出來 說真的 目前對於高精度還一竅不通的我 有些題真心不會 但是最後看看 才發現 我基本上都沒用到高精.例如這個題 正解確實要用高精 但是我還是沒有.我的做法已經在洛谷oj發布了題解 題目 hanoi雙塔問題 noip普及組 2007t4 難度 普...

NOIP2007Hanoi雙塔問題

題目描述 給定a b c三根足夠長的細柱,在a柱上放有2n個中間有空的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的 下圖為n 3的情形 現要將這些國盤移到c柱上,在移動過程中可放在b柱上暫存。要求 1 每次只能移動乙個圓盤 2 a b c三根細柱上的圓盤都要保持上...

1139 NOIP2007 Hanoi雙塔問題

給定a,b,c三根足夠長的細柱,在a柱上放有2n個中間有空的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的 下圖為n 3的情形 現要將 這些國盤移到c柱上,在移動過程中可放在b柱上暫存。要求 1 每次只能移動乙個圓盤 2 a b c三根細柱上的圓盤都要保持上小下大的...