一开始所有数的gcd一定是1
因为1的倍数>2的倍数>3的倍数...
所以一定是构造gcd=2比较快
所以第一步先删掉所有奇数,剩下的gcd=2
那么接下来删掉所有不是4的倍数,剩下的gcd=4
接下来删掉所有不是8的倍数,剩下的gcd=8
一直到这里都很简单
但是观察一下样例3,答案是1 1 3
千万不要以为3是个特例!!而应该提醒你,忘记考虑什么了!!
没错,如果剩下4 8 12这样类似的3个数,我们的算法会删掉4和12,剩下8
但是此时删掉4和8,剩下12却是更优秀的!!
为什么?因为此时后面已经没有16了,不需要去凑8,最后一个数最大就是12
#include <bits/stdc++.h>
using namespace std;
int n,k=1,flag=1;
int main()
{
cin >> n;
int qi=n;
while(n)
{
int x=(n+1)/2;
n/=2;
if(n==0&&x==1&&k+k/2<=qi)//如果是最后一个数字,特判
{
cout<<k+k/2<<" ";
break;
}
for(int i=1;i<=x;i++) cout<<k<<" ";
k*=2;
}
}