2020 CSP第二輪 入門組 優秀的拆分

2021-10-10 11:14:28 字數 1651 閱讀 6980

不得不說,這題還是有點上頭的。

還是那句話:當你意識到普及組不簡單時,一切已經晚了

一般來說,乙個正整數可以拆分成若干個正整數的和。例如,1 = 1,10 =1 + 2 + 3 + 4 等。對於正整數 ? 的一種特定拆分,我們稱它為「優秀的」,當且僅當在這種拆分下,? 被分解為了若干個不同的 2 的正整數次冪。注意,乙個數 ? 能被表示成 2 的正整數次冪,當且僅當 ? 能通過正整數個 2 相乘在一起得到。例如,10 = 8 + 2 = 2^3 + 2^1 是乙個優秀的拆分。但是,7 = 4 + 2 + 1 =2^2 + 2^1 + 2^0 就不是乙個優秀的拆分,因為 1 不是 2 的正整數次冪。現在,給定正整數 ?,你需要判斷這個數的所有拆分中,是否存在優秀的拆分。若存在,請你給出具體的拆分方案。

輸入輸入檔名為 power.in。

輸入檔案只有一行,乙個正整數 ?,代表需要判斷的數。

輸出輸出檔名為 power.out。

如果這個數的所有拆分中,存在優秀的拆分。那麼,你需要從大到小輸出

這個拆分中的每乙個數,相鄰兩個數之間用乙個空格隔開。可以證明,在規定了拆分數字的順序後,該拆分方案是唯一的。

若不存在優秀的拆分,輸出「-1」(不包含雙引號)。

樣例輸入

【樣例 1 輸入】

6【樣例 2 輸入】

7樣例輸出

【樣例 1 輸出】

4 2【樣例 2 輸出】

-1資料範圍限制

對於 20% 的資料,? ≤ 10。

對於另外 20% 的資料,保證 ? 為奇數。

對於另外 20% 的資料,保證 ? 為 2 的正整數次冪。

對於 80% 的資料,? ≤ 1024。

對於 100% 的資料,1 ≤ ? ≤ 1 × 10^7。

提示【樣例 1 解釋】

6 = 4 + 2 = 2^2 + 2^1 是乙個優秀的拆分。注意,6 = 2 + 2 + 2 不是乙個優秀的拆分,因為拆分成的 3 個數不滿足每個數互不相同。

其實這道題有兩種解法,我們首先考慮暴力。

因為沒有2

02^0

20,所以奇數是直接剪枝。

然後,我們直接上dfs,但是我比賽的時候腦子發熱,以為會tle,只留呵呵。所以還是上了個優化,就是找到最小大於這個數的2次方。

然後就出**了

#include

#include

using

namespace std;

int n,p2=

1,len=0;

int a[

10005];

voiddg(

int pow2,

int x)

a[++len]

=pow2;

dg(pow2/

2,x-pow2)

; a[len]=0

,len--;dg

(pow2/

2,x);}

intmain()

while

(p2;if

(p2==n)

dg(p2/

2,n)

;printf

("-1");

return0;

}

2020CSP第二輪方格取數(number)

這道題的難度還是有的,比賽的時候第一直覺是dp可是感覺直接做有後效性。所以還是上爆搜吧 然後完美10分。解題思路 最終程式 還是乖乖地學dp吧 設有 的方格圖,每個方格中都有乙個整數。現有乙隻小熊,想從圖的左上角走到右下角,每一步只能向上 向下或向右走一格,並且不能重複經過已經走過的方格,也不能走出...

CSP2020第二輪遊記

今年csp第二輪在jz考 嘛,因為初賽去過了。就沒什麼感覺了 超大,徒步的話腳直接 廳沒有可以睡舒服的地方差評 中午起來後,就是迷迷糊糊的進入考場 然後看題之前,密碼一直不對。後來發現忘打括號心態 之後看第一題 好傢伙,等我先打個暴力 30min later 可以 年1e9 直接二分 但就是一直調。...

CSP2020第二輪J組簡析

祝各位noiprp 題,奇數 1,偶數從大往小列舉2的次方 include using namespace std int n,k long long a 30 int main a 0 1 k 0 while a k n a k 1 a k 2 k for int i k i i if a i n...