pa
【題目描述】
漢諾塔公升級了:現在我們有n個圓盤和n個柱子,每個圓盤大小都不一樣,
大的圓盤不能放在小的圓盤上面,n個柱子從左到右排成一排。每次你可以將一
個柱子上的最上面的圓盤移動到右邊或者左邊的柱子上 (如果移動之後是合法的
話)。 現在告訴你初始時的狀態, 你希望用最少的步數將第i 大的盤子移動到第i根
柱子上,問最小步數。
【輸入格式】
第一行乙個正整數t,代表詢問的組數。
接下來t組資料,每組資料第一行乙個整數n。
接下來一行每行n個正整數,代表每個柱子上圓盤的大小。
【輸出格式】
輸出共t行,代表每次的答案。如果方案不存在,輸出「−1」 。
【樣例輸入】
4 3
2 1 3
2 7 8
2 10000 1000
3 97 96 95
【樣例輸出】
4 0
-1 20
【樣例解釋】
無。 【資料範圍與規定】
對於70%的資料,n的值都是相等的。
對於100%的資料,1 ≤t≤ 6 × 10^3, 1 ≤ n≤ 7
當時考場上看見這個題直接棄療….zz漢諾塔。
今天吸血鬼又給講了一下,發現也不是難到不能做的地步。(mdzz!快去練暴搜!)
其實這個題其實是打表啊…..用bfs打表,然後對應詢問直接輸出,時空複雜度大丈夫。
對於讀入進來的資料,離散化一下,用z陣列記錄這個盤子是第幾大。
用bit陣列記錄位,這個是當你移動盤子的時候有用的….(具體我也說不太清楚,看**理解理解吧。)
我們開乙個top和place陣列,分別記錄第i個柱子的最上面的盤子,和當前盤子在哪根柱子上,
預處da理biao的時候,首先從初始狀態開始搜(1,12,123,1234……1234567)
每搜到乙個新的可能狀態,就把這個狀態記錄下來。(試想一下,從某個給定狀態到初始狀態的步數==從初始狀態的步數到給定狀態的步數)
細節處理的話,直接看**吧。
(看了半天才看出來鍾小鳥是手打的佇列= =)
orz清北學堂最最最帥的神犇 鐘皓曦曦。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓鐘皓曦 的**
#include
#include
#include
#include
using namespace std;
const int maxn=10000000;
int n,top[10],place[10],bit[10];//最上面|每個盤子位置 |進製儲存
int res[maxn];//答案
intq[maxn];//佇列
int front,tail;//佇列頭尾指標
int w[10],z[10];//z為離散化後的大小
bool use[maxn];
bool cmp(int a,int b)
reverse(place+1,place+x+1);//逆轉 (乙個奇怪的函式)
for (int a=x;a>=1;a--)
top[place[a]]=a;
//初始最上面位置 即123
4567
for (int a=1;a<=x;a++)
}//左移
if (p!=x && (a1] || !top[p+1]))
}//右移 } }
}int main()
//bit 10
1001000
10000...
for(;front<=tail;)
printf("%d",tail);
int t;
scanf("%d",&t);
for(;t--;)
return
0;}
NOI2016江蘇省選Day2T1 詳解
jstsc day2t1 airport 解題報告 問題描述 大意 jsoi王國有n個機場,m條直達航班。每兩個機場之間都有乙個固定的飛行時間。由於流量控制,氣候,地形等因素,從i到j的飛行時間與從j到i的飛行時間不一定相等。飛機每降落在某一機場,都需要例行檢查,維護,加油。在第i座機場維護的時間為...
NOIP2016 提高組Day2 T1 組合數問題
題目描述 組合數表示的是從n個物品中選出m個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定 義,我們可以給出計算組合數的一般公式 其中n 1 2 n 小蔥想知道如果給定n,m和k,對於所有的0 i n,0 j min i,...
清北合肥day1
題目 1.給出乙個由0,1組成的環 求最少多少次交換 任意兩個位置 使得0,1靠在一起 n 1000 2.兩個數列,支援在第乙個數列上區間 1,1 每次花費為1 求a變成b的最小代價 n 1e5 3.有n首歌,每首歌每秒有p i 的機率被破譯 當大於等於t時自動破譯 求期望破譯歌數 題解 t1t2都...