C. Sequence Transformation(找规律,特判)

g c d 1 一开始所有数的gcd一定是1

1 > 2 > 3 . . . 因为1的倍数>2的倍数>3的倍数...

g c d = 2 所以一定是构造gcd=2比较快

, g c d = 2 所以第一步先删掉所有奇数,剩下的gcd=2

4 , g c d = 4 那么接下来删掉所有不是4的倍数,剩下的gcd=4

8 , g c d = 8 接下来删掉所有不是8的倍数,剩下的gcd=8

一直到这里都很简单

3 , 1   1   3 但是观察一下样例3,答案是1\ 1\ 3

3 ! ! , ! ! \color{Red}千万不要以为3是个特例!!而应该提醒你,忘记考虑什么了!!

, 4   8   12 3 , 4 12 , 8 没错,如果剩下4\ 8\ 12这样类似的3个数,我们的算法会删掉4和12,剩下8

4 8 , 12 ! ! 但是此时删掉4和8,剩下12却是更优秀的!!

? 16 , 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;
	}
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106877829
今日推荐