codeforces-1348-D Phoenix and Science

Posted yangkun-

tags:

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

codeforces-1348-Phoenix and Science

传送门:https://codeforces.com/contest/1348/problem/D

题意:最初有一个质量为1的细胞,白天,任意数量的细胞可以分裂成两半,晚上,每个细胞的质量都会加一,问你多少天能正好让细胞的质量和刚好为N,并输出每天都有多少细胞分裂

 因为细胞分裂质量是不变的,只有晚上质量才会增加,而且还是,当前有多少个细胞,质量就增加多少,把所有天质量的增量+最初的1==n即为所求

因为是分裂,一个变俩,两个变四个,所以他是按2的幂次增长,最少的天数也就指定是每天都尽可能的分裂

然后你这么处理完呢,最后还会剩下一个n-sum 你只要把他填到一个合适的位置然后凑成n就好啦

把他插到我们刚刚处理出来的数据

每天的细胞数量:1 2 4 8 16 n-sum 32  他们的总和就是n,1+2+4+8+16+32=sum(因为他有多少细胞质量就会加多少嘛)

他问每天细胞分裂的个数,你想想,头一天是x,这里面有y个分裂了,分裂之后的细胞个数不就是x+y了吗

所以,预处理出2^k 把n-sum也插进去排序,然后求一个差分数组 就是答案了

以上

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define lowbit(a) ((a)&-(a))
 5 #define clean(a,b) memset(a,b,sizeof(a))
 6 const int mod = 1e9+7;
 7 const int inf=0x3f3f3f3f;
 8 const int maxn = 2e5+10;
 9 int _;
10 /////////////////////////////////////////////////////////////////
11 vector<int>ve;
12 int main()
13 {
14     int t;
15     scanf("%d",&t);
16     while(t--)
17     {
18         ve.clear();
19         int n;
20         scanf("%d",&n);
21         for(int i=0;i<30;i++)
22         {
23             if((1<<i)>n) break;
24             n-=(1<<i);
25             ve.push_back(1<<i);
26         }
27         if(n!=0) ve.push_back(n);
28         sort(ve.begin(),ve.end());
29         printf("%d
",ve.size()-1);
30         for(int i=1;i<ve.size();i++)
31         {
32             printf("%d ",ve[i]-ve[i-1]);
33         }
34         printf("
");
35     }
36     return 0;
37 }

 

以上是关于codeforces-1348-D Phoenix and Science的主要内容,如果未能解决你的问题,请参考以下文章

HBase集成Phoenix,构建Phoenix view和table的区别

Phoenix 实践——Phoenix 表的视图构建(表映射)总结小记

Phoenix入门

Phoenix入门

Phoenix映射HBase数据表

Phoenix&HBase实践——Phoenix+HBase结合实践操作总结