有這麼乙個遊戲:
寫出乙個11至nn的排列a_iai
,然後每次將相鄰兩個數相加,構成新的序列,再對新序列進行這樣的操作,顯然每次構成的序列都比上一次的序列長度少11,直到只剩下乙個數字位置。下面是乙個例子:
3,1,2,43,1,2,4
4,3,64,3,6
7,97,9
最後得到1616這樣乙個數字。
現在想要倒著玩這樣乙個遊戲,如果知道nn,知道最後得到的數字的大小sumsum,請你求出最初序列a_iai
,為11至nn的乙個排列。若答案有多種可能,則輸出字典序最小的那乙個。
[color=red]管理員注:本題描述有誤,這裡字典序指的是1,2,3,4,5,6,7,8,9,10,11,121,2,3,4,5,6,7,8,9,10,11,12
而不是1,10,11,12,2,3,4,5,6,7,8,91,10,11,12,2,3,4,5,6,7,8,9[/color]
輸入格式
兩個正整數n,sumn,sum。
輸出格式
輸出包括11行,為字典序最小的那個答案。
當無解的時候,請什麼也不輸出。(好奇葩啊)
輸入輸出樣例
輸入 #1
4 16
輸出 #1
3 1 2 4
說明/提示
對於40%40%的資料,n≤7n≤7;
對於80%80%的資料,n≤10n≤10;
對於100%100%的資料,n≤12,sum≤12345n≤12,sum≤12345。
解題思路:
很新穎的搜尋方式,將搜尋和楊輝三角結合在了一起,首先你可以看出他的規律,就是他每個數所在的位置決定了它為最終加和得到的那個數做了多少貢獻。比如說樣例這個數,每個數的貢獻就是1,3,3,1,也就是第乙個數加了一次,第二個數加了三次,以此類推。所以我們先講每乙個n所對應的楊輝三角的數寫出來,然後開始搜尋。首先我們搜尋的初始時(0,-1,0),然後判斷兩個情況的時候重新搜尋,也就是所謂的剪枝。再然後就是搜尋的細節了,每個位置從1到n,如果這個數沒有用過的話就開始使用這個數搜尋,這樣的話可以保證答案的字典序最小,恩,差不多要注意的就是這麼多。
ac**:
#include
using namespace std;
const
int n =
1010
;int n , sum;
int vis[n]
;int ans[n]
;int flag;
const
int pt[
13]=//先打一張楊輝三角表
,// n = 1
,// n = 2
,// n = 3
,// n = 4
,// n = 5
,// n = 6
,// n = 7
,// n = 8
,// n = 9
,// n = 10
,// n = 11};
intdfs
(int p ,
int k ,
int res)
//p是第p個數,k是值,res是當前的總和
else
return0;
} vis[k]=1
;for
(int i =
1; i <= n ; i++)}
vis[k]=0
;return0;
}int
main()
cout << endl;
}return0;
}
P1118 USACO06FEB 數字三角形
有這麼乙個遊戲 寫出乙個1 n的排列a i 然後每次將相鄰兩個數相加,構成新的序列,再對新序列進行這樣的操作,顯然每次構成的序列都比上一次的序列長度少1,直到只剩下乙個數字位置。下面是乙個例子 3 1 2 4 4 3 6 7 9 16 最後得到16這樣乙個數字。現在想要倒著玩這樣乙個遊戲,如果知道n...
數字三角形
題目描述 示出了乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路 徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 1 三角形行數 25 三角形中的數字為整數 1000 輸入第一行為n,表示有n行 後面n行表示三角形每條路的路徑權 輸出路徑所經過的數字的總和最大的答案 樣...
數字三角形
description 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?input 輸入資料首先包括乙個整數c,表示測試例項的個數,每個測試例項的第一行是乙個整數n 1 n 100 表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,...