[15894]砍竹子

(注:复制下来太难改了,直接截图懒得改)



image
解释全在代码里,自己看吧

for(ll i=1,j;i<=n;i++){
    cin>>a[i];//输入
    j=a[i];//不能直接改a[i]
    cnt[i]=0;//砍的次数
    while(j!=1){
      j=sqrtl(j/2+1);
      cnt[i]++;//记录看的次数
    }
    res=max(res,cnt[i]);//最大砍的次数
  }
  for(ll i=res;i>=1;i--){
    for(ll j=1;j<=n;j++){
      if(cnt[j]==i){//与当前砍的次数相等
        if(a[j]!=a[j+1])ans++;//不等于后面的高度魔法使用次数+1
        a[j]=sqrtl(a[j]/2+1);//砍过后的长度
        cnt[j]--;//砍的次数-1
      }
    }
  }

(注:sqrtl是用于处理更大范围的数的库函数,与sqrt一样都是开根号)