1. 程式人生 > 其它 >cf1348 D. Phoenix and Beauty(思維,貪心)

cf1348 D. Phoenix and Beauty(思維,貪心)

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;
}