题意: 每个细菌可以在白天的时候分裂,当一个细菌分裂成两个细菌时,子细菌的质量为母细菌的一半,晚上的时候,每个细菌的质量自增1,第一天会有一个质量为1的细菌。现要得到总质量为n的细菌,问最少几天能得到,并说明这几天内,每天分裂的细菌数
思路:说实话看样例解释的话容易看晕,且容易带偏方向,要你求的是多少天后质量能到达n,所以不用管那天的具体的细胞数,我们只要知道它的每天的增量就可以了。假设当前天有x个,晚上分裂t个,那么增加的质量就为2*t+(x-t)等于x+t,所以增加的质量之和x和t有关。要想使得天数最少,我们是不是尽可能地多分裂,于是最理想地质量增加方式就是1 2 4 8 16.。。。但是假设n为9,那么到了1 2 4地时候就可以停了,后面不能再有8(因为否则就要超过9了),但是这个时候还差2个怎么办呢?很简单因为此时x为7,我们只要让t等于2不就行了(也就是选择2个细菌来分裂)。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
vector<int>ans;
int T,n;
int main()
{
scanf("%d",&T);
while(T--)
{
ans.clear();
scanf("%d",&n);
int sum=0;
for(int i=1;sum+i<=n;i<<=1)
sum+=i,ans.push_back(i);
if(sum<n) ans.push_back(n-sum);
sort(ans.begin(),ans.end());
printf("%d\n",ans.size()-1);
for(int i=1;i<ans.size();++i) printf("%d ",ans[i]-ans[i-1]);
puts("");
}
}