問題:
給定乙個1~n的排列a[i],每次將相鄰兩個數相加,得到新序列,再對新序列重複這樣的操作,顯然每次得到的序列都比上一次的序列長度少1,最終只剩乙個數字。
例如:3 1 2 4
4 3 6
7 9現在如果知道n和最後得到的數字sum,請求出最初序列a[i],為1~n的乙個排列。若有多種答案,則輸出字典序最小的那乙個。資料保證有解。
解決方法:遞迴思想。
c原始碼:
#include
#include
#include
int flag =0;
//找到的滿足條件為1,反之則0;
void
dfs(
int arry,
int visited,
int n,
int index,
int sum)
;int
main()
;//訪問過置1,沒訪問過置0;
int n =0;
int sum =0;
scanf
("%d %d"
,&n,
&sum)
;dfs
(arry, visited, n,
0, sum)
;return0;
}void
dfs(
int arry,
int visited,
int n,
int index,
int sum)
for(j =
0; j1; j++
)//計算}if
(arry1[0]
==sum)
//檢查是否滿足條件
flag =1;
//滿足後將flag置1,就算再有其他滿足的情況也不會輸出。(這裡,我們最先得到的滿足條件的情況就是題目中要求的字典序最小的情況)}}
}int i =0;
for(i =
1; i<=n; i++
)//從1到n,乙個個的去試;
}}
藍橋杯 數字遊戲
問題描述如下 問題不難,最大的問題是溢位,如果使用long long而直接暴力求借,溢位問題依舊存在。如何解決呢,不難得出第i個人心中的數是1 1 2 3 i 1 所以到下一次棟棟心裡的數為1 1 2 3 4 5 n 其中n為已經有n人次報過數 為了避免溢位,筆者的做法是保留上次棟棟報數的值,假設為...
藍橋杯 數字遊戲
題目描述 解題過程 最初以為是乙個迴圈節問題,樣例確實是迴圈的,多寫幾組就發現了。但是,其實是乙個坑,根本不是什麼迴圈節。於是我直接暴力做了一遍,過了一半資料 include using namespace std const int maxn 1e6 7 typedef long long ll ...
藍橋杯 歷屆試題 數字遊戲
這道題給了乙個很明顯的乙個序列,那麼就是數列可以一次寫為 1 0 1 0 1 1 0 1 2 1 0 1 2 3 1 0 1 2 n 1 這樣就轉化為1加上乙個等差數列,那麼直接按照等差數列求和公式sn a1 an n 2 這樣就很容易求出答案。但是中間用公式的時候會用到i n i n 1 注意i和...