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...