提示: 当有的元素分裂的同时,其他元素也可以+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 }
抓住青春的尾巴。。。