[CF1348D] Phoenix and Science - 贪心

Posted mollnn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF1348D] Phoenix and Science - 贪心相关的知识,希望对你有一定的参考价值。

Description

有一个质量为 (1) 的细菌。接下来的每一天,会有若干个细菌分裂成两个(0 $ le $ 分裂的细菌的数量 $ le $ 当前的细菌数),两个细菌的质量皆为原来细菌的一半。所有细菌分裂完之后每个细菌的质量增长1。
给出你一个整数 $ n $,构造方案能够在若干天后使得细菌质量的和等于 $ n $

Solution

分裂不会影响总质量,只会影响此后质量增加的速度,若当前数量为 (x),则 (x le Delta m le 2x)

于是贪心地取,当不够的时候就将不够的一次取走即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;

int n;

signed main() {
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--) {
        cin>>n;
        vector <int> v;
        int x=1;
        while(n>0) {
            v.push_back(min(n,x));
            n-=x;
            x*=2;
        }
        sort(v.begin(),v.end());
        cout<<v.size()-1<<endl;
        for(int i=1;i<v.size();i++) cout<<v[i]-v[i-1]<<" ";
        cout<<endl;
    }
}

以上是关于[CF1348D] Phoenix and Science - 贪心的主要内容,如果未能解决你的问题,请参考以下文章

[CF1348D] Phoenix and Science - 贪心

CF1348E Phoenix and Berries(dp)

[CF1515F]Phoenix and Earthquake

CF 1348F Phoenix and Memory

CF 1348F Phoenix and Memory

[CF1515G]Phoenix and Odometers