1. 程式人生 > >Codeforces Round #514 (Div. 2) C. Sequence Transformation 思維構造

Codeforces Round #514 (Div. 2) C. Sequence Transformation 思維構造

題意 給出一個1-n的集合   gcd 集合裡面的所有數  得到的 一個 數   然後自己選擇刪去一個數   要使得到的數 構成的數列 的字典序最大

思路: gcd所有數 那gcd得到的數肯定要小於陣列中最小的數  所以 剛開始都是1   所以優先刪去1  那就要使gcd所有數經可能快得到 2  

如何快速到2 呢 那就是把奇數全部刪掉  那剩下得數最小就為2 了  此時為 2 4 6 8 10。。。。  此刻就從2開始刪   當n==3時 有

x ,2x,3x  此時 只有 刪 x 2 x   3x 才有最大得字典序  x,x,3x  處理一下就好

(看起來好多人過了,但沒看題解就是不會,數學都忘光了,太菜了TAT)

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n;
  cin>>n;
  int cnt=1;
  while(n){
	  if(n==3){
		  printf("%d %d %d",cnt,cnt,cnt*3);
		  break;
	  }
	  for(int i=1;i<=n/2+n%2;i++){
           printf("%d ",cnt);
	  }
	  cnt*=2;
	  n/=2;
  }
	return 0;
}