一、題目描述(懶人可直接跳過看題目概述)
swust oj 題目0254
二、問題概述
給出一列數,每次可將包含首項的子串行翻轉,也就是說從開頭數若干個數字進行翻轉
翻轉操作具體如:1 2 3 4 5 → 5 4 3 2 1 ,直白來講就是倒過來念
要求用最少的翻轉次數後,使數列從小到大排列
三、問題分析
先找到最大的數,把它翻轉到第乙個,接著翻轉整個數列把它置於最後乙個,這樣完成一次操作
最大的數已經置於末尾,那麼之後的操作需要對它不造成影響,所以把數列數 -1,也就是丟下最後乙個數不管了
然後我們處理剩下的 n-1 個數列,即處理子問題
這裡容易出現乙個錯誤,如果最大的數為第乙個數,那麼就不需要進行第一次翻轉,此處需要特判一下
四、ac**
1 #include2 #include3 #include4 #include5 #include6 #include7提交結果#define n 1001
8using
namespace
std;910
intn,ans,a[n];
11void change(int
x)12
20int
main()
2133
if (k!=n)
3438 n--;39}
40 printf("
%d\n
",ans);
41return0;
42 }
翻煎餅 迭代加深搜尋 剪枝
這裡有道類似的 題目 使用迭代搜尋,最多只能跑過 n 7 n 7n 7 的資料,需要剪枝,每次旋轉相鄰數字之間的差值變化最微小,翻轉一次僅有一對數字間的差的絕對值會發生改變,於是統計有cnt cntcn t數字間絕對值不為 1 11,則至少需要 cnt cntcn t 次操作到終態,依此進行剪枝 沒...
題目標題 翻硬幣(模擬)
小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那麼對...
劉小白第乙個博文 演算法分析(翻煎餅)
輸入包括兩行,第一行是乙個整數n 1 n 1000 表示煎餅的個數,接下來的一行有n個不相同的整數,整數間用空格隔開,每個整數表示煎餅的大小 直徑 左邊表示頂部,右邊表示底部。輸出為一行,翻煎餅的最少次數 55 4 2 3 1 樣例輸出 4 include include include using...