cf1348 D. Phoenix and Beauty(思維,貪心)
阿新 • • 發佈:2021-10-18
https://codeforces.com/contest/1348/problem/D
題意:
初始有一個細菌,重量為1。每個細菌白天可以分裂成兩個,重量均為原來的一半。每個夜晚,每個細菌會增加1重量
現在你可以決定每個白天有幾個細菌分裂,問至少經過幾晚細菌的總重量恰為n。輸出每天有幾個細菌分裂
思路:
分裂不會增加總重量,故只用考慮夜晚增加的重量
貪心。假設前 d 天每個細菌都分裂,那麼第 d 夜後總重量為 \(1(初始重量)+2^2+2^2+\cdots 2^d = 2^{d+1}-1\)
還需要 \(k=n-(2^{d+1}-1)\) 。注意到每晚增加的重量不小於前一晚增加的重量,所以 k 不能在最後一晚,而應插入到中間的一個位置使陣列遞增。實測用 sort 排序跟手動插入速度一樣
#include <bits/stdc++.h> using namespace std; int a[35]; signed main() { int T; scanf("%d", &T); while(T--) { int n, d; scanf("%d", &n); for(d = 0; (1<<d)-1 < n; d++) a[d] = 1<<d; a[d-1] = n+1-a[d-1]; sort(a, a+d); printf("%d\n", d - 1); for(int i = 1; i < d; i++) printf("%d ", a[i]-a[i-1]); puts(""); } return 0; }