2020CSP J普及組複賽(民間資料)題解

2021-10-10 12:46:16 字數 1792 閱讀 6150

這一道題就是一道簽到題

這道題我們可以很快速的發現,若n為奇數(即n%2==1),則n必定無法拆分;若n為偶數,其實就只需要有以下操作:

1.先通過計算2的k次冪,找到第乙個滿足大於等於n的值

2.計算當n-k>=0時,輸出k,隨後將k = k/2 最後當n等於0,則輸出即為其優秀拆分

還可以直接把2的次冪打出來,再列舉

**

#include

#include

#include

#include

using

namespace std;

const

int m=

1e5+5;

int a[

105]=;

intmain()

int ans[

105]

,cnt=0;

for(

int i=

23;i>=

1;i--)}

return0;

}

方法一(不知道是否是正解)

這道題可以直接用優先佇列做出來(不會點這裡)

用兩個優先佇列,乙個大根堆,乙個小根堆。用大根堆去存大於分數線的值,用小根堆去存小於分數線的所有值。

**

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int m=

1e5+5;

priority_queue<

int, vector<

int>

, greater<

int>

> q1;

priority_queue<

int> q2;

int a[m]

;int

main()

int old=1;

q1.push

(a[1])

;printf

("%d "

,a[1])

;for

(int i=

2;i<=n;i++

)else

if(now>old)

printf

("%d "

,q1.

top())

;}return0;

}

方法二觀察到資料範圍裡成績在600以內,因此可以用桶排序。有600個桶,每個選手處,把他分數對應的桶裡的個數++。然後從第600號桶倒序迴圈到1號桶,進行人數統計,輸出max

(1,⌊

p×w%

⌋)

max(1, ⌊p×w\%⌋)

max(1,

⌊p×w

%⌋)人處的分數。時間複雜度為o

(600n)

o(600n)

o(600n

)。**

#include

#include

#include

#include

using

namespace std;

int n, w, b[

605]

;int

main()

else}}

return0;

}

2020 CSP J 初賽解析

題面 老師給的解析 自己覺得很好的一篇題解 直接說重點題吧,不耽誤時間了 這個很顯然就是讓進這個 while 的次數盡可能少,那麼我們可以讓他只進一次 while,即讓第一次進 while 的時候就令 flag 1 由於只進一次 while,那麼只需要算第一次進的時候需要比較幾次 很顯然,n 個數需...

2020csp J 考完有感

2020真是個風雲變幻的一年,更讓人感受到這真是乙個新的時代。自從上一次2019與普及失之交臂後 只差5分 我一直視為我自己初中的遺憾,到了初三這個關鍵時期,我沒有太多的時間放在程式設計上,所以老實說,內心比較忐忑,那天到了考場,看見滿場的人,真是讓我有了打退堂鼓的衝動,幸運的是,這次考的比較好,各...

CSP J2020普及組複賽T1 優秀的拆分

一般來說,乙個正整數可以拆分成若干個正整數的和 例如,1 1 1 11 1,10 1 2 3 4 10 1 2 3 4 10 1 2 3 4 等。對於正整數 n nn 的一種特定拆分,我們稱它為 優秀的 當且僅當在這種拆分下,nnnn nn被分解為了若干個不同的 2 22 的正整數次冪。注意,乙個數...