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,a3…ak,a1=1,满足i=1∑kai=n,∀i∈[1,k−1],ai≤ai+1≤2ai使
k
k
k最小。
根据贪心思想:将
1
,
2
,
4
…
2
x
1,2,4\\dots 2^x
1,2,4…2x依次放入数组直到不能再放,若此时
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
a2−a1,a3−a2,a4−a3……ak−ak−1
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 - 贪心
codeforces-1348-D Phoenix and Science
CF1348D Phoenix and Science(思维)