D. Phoenix and Science(贪心&排序)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Phoenix and Science(贪心&排序)相关的知识,希望对你有一定的参考价值。

D. Phoenix and Science(贪心&排序)

题目传送门

算法:贪心
时间复杂度 O ( l o g n ) O(logn) O(logn)
思路:题目可以转化为构造一个数组: a 1 , a 2 , a 3 … a k , a 1 = 1 , 满足 ∑ i = 1 k a i = n , ∀ i ∈ [ 1 , k − 1 ] , a i ≤ a i + 1 ≤ 2 a i a_1,a_2,a_3\\dots a_k,a_1=1,\\text满足\\sum\\limits_i=1^k a_i=n,\\forall i\\in[1,k-1], a_i\\le a_i+1\\le2a_i a1,a2,a3ak,a1=1,满足i=1kai=n,i[1,k1],aiai+12ai使 k k k最小。
根据贪心思想:将 1 , 2 , 4 … 2 x 1,2,4\\dots 2^x 1,2,42x依次放入数组直到不能再放,若此时 n = = 0 n==0 n==0刚好满足,否则将此时的 n n n放入数组再排序即可。最后答案序列即为:
a 2 − a 1 , a 3 − a 2 , a 4 − a 3 … … a k − a k − 1 a_2-a_1,a_3-a_2,a_4-a_3……a_k-a_k-1 a2a1,a3a2,a4a3akak1

AC代码:

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm> 
#include<vector>
using namespace std;
int main()
	int t;
	scanf("%d",&t);
	while(t--)
		int n;
		scanf("%d",&n);
		vector<int>v;
		for(int i=1;i<=n;i*=2)
			v.push_back(i),n-=i;
		if(n>0) v.push_back(n);
		sort(v.begin(),v.end());
		printf("%d\\n",v.size()-1);
		for(int i=1;i<v.size();i++)
			printf("%d ",v[i]-v[i-1]);
		puts(""); 
	
	return 0;
 

以上是关于D. Phoenix and Science(贪心&排序)的主要内容,如果未能解决你的问题,请参考以下文章

[CF1348D] Phoenix and Science - 贪心

D. Phoenix and Socks

codeforces-1348-D Phoenix and Science

CF1348D Phoenix and Science(思维)

Codeforces Global Round 14, D. Phoenix and Socks

Phoenix and Distribution(字典序贪心)