码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1348D] Phoenix and Science - 贪心

时间:2020-05-08 09:59:19      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:sign   size   out   sync   des   sci   push   long   原来   

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 - 贪心

标签:sign   size   out   sync   des   sci   push   long   原来   

原文地址:https://www.cnblogs.com/mollnn/p/12847807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!