已退役


私信TA

用户名:15893197790

访问量:14398

签 名:

努力学习,积极生活。

等  级
排  名 389
经  验 5119
参赛次数 0
文章发表 43
年  龄 0
在职情况 学生
学  校 南京大学
专  业 计算机科学与技术

  自我简介:

已退役。研究生方向为AI+软件工程,欢迎学术交流!

TA的其他文章

解题思路:就是分成一层一层的(以高度为1为最底层),每一层需要砍的次数之和就是答案,显然最大不超过64层(long long的上限),所以时间复杂度就是O(n)

,系数最大不超过64

注意事项:

参考代码:

#include<bits/stdc++.h>

using namespace std;

#define maxn 200010

typedef long long ll;

int n;

ll h[70][maxn],ans,maxh;

int main(){

    scanf("%d",&n);

    for(int i=1;i<=n;i++)scanf("%lld",&h[0][i]);

    int num;//砍多少次砍到1

    int maxnum=0,tmp;

    for(int i=1;i<=n;i++){

        num=0;

        while(h[num][i]>1){

            h[num+1][i]=(ll)sqrt((double)((h[num][i]>>1)+1));

            num++;

        }

        maxnum=max(num,maxnum);

        for(int j=0;j<=num/2;j++){

            tmp=h[j][i];

            h[j][i]=h[num-j][i];

            h[num-j][i]=tmp;

        }

    }

    for(int j=maxnum;j>=1;j--){

        for(int i=1;i<=n;i++){

            if(h[j][i]!=h[j][i-1]&&h[j][i])ans++;

        }

    }

    printf("%lld",ans);

    //system("pause");

    return 0;

}


 

0.0分

3 人评分

  评论区

  • «
  • »