t030 數字構造

2021-09-28 10:01:00 字數 1597 閱讀 1311

time limit: 3 second

memory limit: 256 mb

【問題描述】

有這麼乙個遊戲: 寫出乙個1~n的排列a[i],然後每次將相鄰兩個數相加,構成新的序列,再對新序列進行這樣的操作,顯然每次構成的序列都比上一次的序列長度少1,直到只剩下乙個數字位置。下面是乙個例子:

3 1 2 4

4 3 6

7 9

16 最後得到16這樣乙個數字。

現在想要倒著玩這樣乙個遊戲,如果知道n,知道最後得到的數字的大小sum,請你求出最初序列a[i],為1~n的乙個排列。若答案有多種可能,則輸出字典序最小的那乙個。

【資料規模】

對於40%的資料,n≤7;

對於80%的資料,n≤10;

對於100%的資料,n≤12,sum≤12345,且保證一定有解。

【輸入格式】

輸入檔案bds.in的第1行為兩個正整數n,sum。
【輸出格式】

輸出檔案bds.out包括1行,對於每個詢問輸出答案。
【輸入樣例1】

4 16

【輸出樣例1】

3 1 2 4

【題目鏈結】:

【題解】

可以畫一畫樣例

注意觀察一下最後的答案;

發現其實最後答案=3*1+3*2+1*3+1*4

可以看到第一行的各項的係數是分別是c[3][0],c[3][1],c[3][2],c[3][3];

發現規律!

最後的答案就為

設第一行的第i列元素為a[i]

則最後一行的那乙個元素為∑a[i]*c[n-1][i-1]

則我們先預處理出組合數(c[i][j] = c[i-1][j-1]+c[i-1][j])

然後列舉第一行的各個元素分別是什麼;

然後o(1)得到最後一行的那唯一乙個元素;

看看是不是所要求的sum;

因為這個∑符號裡面的各項都是正數,所以可以寫乙個剪枝;

如果前i項的∑a[i]*c[n-1][i]>sum,則直接剪掉;就不用再等到i=n的時候再判斷了;

sum比較小;這個剪枝還是很強力的;

【完整**】

#include 

#include

#define rei(x) scanf("%d",&x)

#define rep1(i,x,y) for (int i = x;i <= y;i++)

const

int maxn = 15;

int n,sum,a[maxn];

int c[maxn][maxn];

bool bo[maxn];

void dfs(int x,int now)

exit(0);

}return;

}rep1(i,1,n)

if (!bo[i])

}int main()

C 備忘錄030 模版式的「建構函式」

include include include class xfriend std ostream operator std ostream os,const x x private std string name intmain x d1 without enable if,this line w...

STM32F030C8T6低功耗筆記

2018年5月8日 這個晶元的低功耗搞了好久了,剛開始是7ma降不下去,然後是降到了1ma,到現在的200ua,還是有地方沒有弄好,目標是降到50ua左右,目前遇到了問題,進入stop模式的時候降到了110ua,然後會慢慢回公升80ua。這裡先寫一下之前的一些總結。首先進入的是stop模式,因為這個...

stm32f030c8t6 MCU進入低功耗模式

1.sleep 模式 2.stop 模式,在這個模式下,io管腳保持run狀態下的電平,ram保持不變,所以在進入這個狀態之前,先先將io口配置好,否則可能會有漏電流 3,standby模式下,ram不保持,io管腳進入高阻態,啟用就於系統reset rcc apb1periphclockcmd r...