charles和sunny在玩乙個簡單的遊戲。若給出1~n的乙個排列a,則將a1、a2相加,a2、a3相加……an-1、an相加,則得到一組n-1個元素的數列b;再將b1、b2相加,b2、b3相加,bn-2、bn-1相加,則得到一組n-2個元素的數列……如此往復,最終會得出乙個數t。而charles和sunny玩的遊戲便是,charles給出n和t,sunny在盡可能短的時間內,找到能通過上述操作得到t且字典序最小的1~n的排列。(sunny大聲說:「what an easy game!」,接著幾下就給出了解),charles覺得沒意思,就想和你玩,當然,你可以用一種叫做「電子計算機」的東西幫你。
輸入:
本題有多組資料,對於每組資料:一行兩個整數n(0輸出:
對於每組測試資料輸出一行n個整數,用空格分開,行尾無多餘空格,表示求出來的滿足要求的1~n的乙個排列。
樣例輸入:
4 16
3 9
0 0
樣例輸出:
3 1 2 4
1 3 2
對樣例解釋:
開始排列:3、1、2、4
第一次操作:3+1=4 1+2=3 2+4=6
得到:4、3、6
第二次得到:7、9
最後就是:16
題目要求1-n的乙個排列a1,a2…an使得c(n-1,0)*a1+c(n-1,1)*a2+….+c(n-1,n-1)*an=t-------1式,(有點像楊輝三角)
方法很好確定,先把c(n-1,i)求出來,然後只要把每乙個位上的數確定好就可以了,所以採用深度優先搜尋的方法。
方法:直接搜,用dfs(x,y)表示當前將要確定第x個位置上數,已經確定的和為y,把每種情況都搜出來,然後在遞迴出口的位置判斷1式是否成立,不過很可惜,這種方法得不到分(超時);
剪枝一:加乙個小小的優化,就是在確定第x個數時,保證新求出來的y不能大於t,加上這個優化後,可以得40分;
剪枝二:由於c(n-1,i)=c(n-1,n-1-i),具有對稱性,題目又要求最小字典序列,所以在列舉時當x>n div 2 時,要保證a[x]>a[n+1-x],這樣程式速度會提高,但是該題還是只能得40分;
剪枝三:當列舉到第x個數時,剩餘的n-x個數,與剩餘的n-x個係數一一對應,讓大數和大係數相乘,小數和小係數相乘可以得到最大值,讓大數和小係數相乘,小數和大係數相乘可以得到最小值,如果剩餘的值不在這個範圍內,就不要搜下去,這樣可以大大優化,拿樣例舉例來說:
n=4,t=16。
當列舉a[1]=1時,剩餘16-1*1=15,剩餘的未放置的數為2,3,4,剩餘的係數為1,3,3,這樣最大值為4*3+3*3+2*1=23,最小值為4*1+3*3+2*3=19,都超過了15,所以第乙個數不能選1。
其實就是dfs+一堆優化。噁心,還不能保證是否過。
1 #include2 #include3 #include4 #include5 #include6#define n 55
7using
namespace
std;
8int
f[n][n];
9int
q[n],t[n],x[n];
10int n=1,m=1;11
bool
b;12
bool cmp(int x,int
y) 15
void
pre() 22}
2324}25
bool pd(int dep,int
s) 30 sort(x,x+n-dep+1
,cmp);
31int j=0;32
for (int i=n; i>=1; --i) 37}
38if (an41 an=s;
42 j=0;43
for (int i=1; i<=n; ++i) 48}
4950
if (an>m)
53return
false;54
}55void dfs(int dep,int
s) 62 printf("\n"
);63 b=1;64
}65return;66
}67if (s>m)
70if (pd(dep+1
,s))
73if (dep>n/2 && q[dep]1
]) 76
for (int i=1; i<=n; ++i) 83}
84}85int
main()
95return0;
96 }
這種題優化不能保證過,但你也沒有辦法。
這道題也是看了題解才過的。
紀中生活 1 0
這是第一次寫部落格,前幾天還不想寫。普及組模擬 暴力搜尋每乙個數,而且答案最大是2,但有多個資料防打表。capacity 乙個x電容併聯後變成x 1會變大,串聯後變成x x 1 會變小,我們最終要把需要的電容變成1,那麼我們就反著推,如果當前電容大於1,最後一次操作就是併聯,併聯前是x 1 即 a ...
人在自然中生活
江南可採蓮,蓮葉何田田。是否你總幻想著乘一葉小楫輕舟,在半人高的荷葉中穿行。讓雙手優雅地撫過帶著露珠的蓮蓬,深吸一口,那股清香便已讓你沉醉。明月松間照,清泉石上流。是否你總嚮往著能在乙個寧靜的月夜,獨自漫步於松林中,泉水叮咚是內心的旋律,詩情畫意的時間在此刻為你停留。而殘酷的現實總將你從夢想中喚醒,...
日常生活中生薑的用處
size medium 頻嚼生薑,或用生薑研汁服,可以 嘔吐。乘車前喝些生薑汁水,或切一片生薑貼在手腕內側腕後橫紋2寸處,用紗布包好,能防 止暈車。在乘車途中含幾片生薑,有助於抑制暈車嘔吐。將生薑搗碎與紅糖混合,衝薑糖水熱飲,可治妊娠嘔吐或痛經。用鮮生薑汁半杯,蜜2匙,加水調勻飲服,可治脾胃虛弱不能...