ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #638 D. Phoenix and Science(贪心/思维好题)

2020-05-02 17:00:25  阅读:287  来源: 互联网

标签:Phoenix 638 Science sum day int mass 细菌 bacteria


Phoenix has decided to become a scientist! He is currently investigating the growth of bacteria.

Initially, on day 11, there is one bacterium with mass 11.

Every day, some number of bacteria will split (possibly zero or all). When a bacterium of mass mm splits, it becomes two bacteria of mass m2m2 each. For example, a bacterium of mass 33 can split into two bacteria of mass 1.51.5.

Also, every night, the mass of every bacteria will increase by one.

Phoenix is wondering if it is possible for the total mass of all the bacteria to be exactly nn. If it is possible, he is interested in the way to obtain that mass using the minimum possible number of nights. Help him become the best scientist!

Input

The input consists of multiple test cases. The first line contains an integer tt (1≤t≤10001≤t≤1000) — the number of test cases.

The first line of each test case contains an integer nn (2≤n≤1092≤n≤109) — the sum of bacteria masses that Phoenix is interested in.

Output

For each test case, if there is no way for the bacteria to exactly achieve total mass nn, print -1. Otherwise, print two lines.

The first line should contain an integer dd  — the minimum number of nights needed.

The next line should contain dd integers, with the ii-th integer representing the number of bacteria that should split on the ii-th day.

If there are multiple solutions, print any.

Example Input Copy
3
9
11
2
Output Copy
3
1 0 2 
3
1 1 2
1
0 
//

对于每一天来说,细菌先分裂再增加mass。假设每晚细菌的mass不增加的话,最终的mass之和肯定还是1,所以说只需要考虑增加的mass。
要达到题目所说的最快,肯定是希望每一个细菌在每天都分裂(指数增长)。
这样可以构造一个序列20,21,22...2x(序列的和小于等于n),1...x代表天数,序列的每一项的含义可以认为是这一天的细菌数。
而这个序列的和就是总的mass值,因为每天晚上每个细菌的mass加1.
这样的话,假设序列和恰好等于n,这无疑是最少的天数,如果不等的话,把n-sum插入序列中再由小到大排序,这样比sum恰好等于n时的天数多1.
可以这么理解,比如对于2i,n-sum,2i+1 第i天只有部分细菌分裂,使得第i+1天的个数到达n-sum,第i+1天的n-sum个细菌再部分分裂使得第i+2天细菌个数达到2i+1从而完成原来方案的无缝衔接,显然这也是最优情况。
输出的话直接输出构造出来的序列的差分序列即可,因为增加的细菌的个数就是分裂的细菌的个数。
#include <bits/stdc++.h>
using namespace std;
int n;
int fpow(int a,int b)
{
    int ans=1;
    for(;b;b>>=1)
    {
        if(b&1)ans*=a;
        a*=a;
    }
    return ans;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        int sum=0,day=0,i;
        vector<int>v;
        v.push_back(0);
        while(1)
        {
            int temp=fpow(2,day);
            if(sum+temp>n)
            {
                day--;
                break;
            }
            sum+=temp;
            v.push_back(temp);
            day++;
        }
        if(sum!=n)
        {
            v.push_back(n-sum);
            sort(v.begin(),v.end());
            cout<<day+1<<endl;
        }
        else
        {
            cout<<day<<endl;
        }
        for(i=1;i<v.size()-1;i++)
        {
            cout<<v[i+1]-v[i]<<' ';
        }
        cout<<endl;
    }
    return 0;
}

 

标签:Phoenix,638,Science,sum,day,int,mass,细菌,bacteria
来源: https://www.cnblogs.com/lipoicyclic/p/12818643.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有