提示:  当有的元素分裂的同时,其他元素也可以+1

分析: 逆向思维,把当前数列变成一个0;

相应得操作相反:

       每个元素减1

       相同得两个元素可以合并

设数列中最大的数是max,则一共需要减max次才可以把所有的数字变成零

每次减一的过程 非零元素减一 零元素合并

最后剩余下k个零 再把K个零变成一个零。。。。。半年不看,都忘了当初怎么想的了。自己真是菜

 1 #include<cstring>
 2 #include<algorithm>
 3 #include <iostream>
 4 using namespace std;
 5 const int N=1e6+1;
 6 int a[N];
 7 int n;
 8 int main()
 9 {
10     ios::sync_with_stdio(false);
11     while (cin>>n) {
12         memset(a,0,sizeof(a));
13         int temp;
14         int b=-1;
15         for (int i=1;i<=n;i++) {
16             cin>>temp;
17             a[temp]++;
18             b=max(b,temp);
19         }
20         int k=a[0];
21         int ans=0;
22         for (int i=1;i<=b;i++) {
23             k=k-(k>>1)+a[i];
24             ans++;
25         }
26         while (k!=1) {
27             k=k-(k>>1);
28             ans++;
29         }
30         cout<<ans<<"\n";
31     }
32     return 0;
33 }