這一道題就是一道簽到題
這道題我們可以很快速的發現,若n為奇數(即n%2==1),則n必定無法拆分;若n為偶數,其實就只需要有以下操作:
1.先通過計算2的k次冪,找到第乙個滿足大於等於n的值還可以直接把2的次冪打出來,再列舉2.計算當n-k>=0時,輸出k,隨後將k = k/2 最後當n等於0,則輸出即為其優秀拆分
**
#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 的正整數次冪。注意,乙個數...