欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

牛客网NC30-20.8.05-树,贪心

程序员文章站 2024-02-12 22:41:40
...

题目链接NC30
题意、输入、输出
牛客网NC30-20.8.05-树,贪心
牛客网NC30-20.8.05-树,贪心
分析:对于题叙述的构造方法,一颗树,深度大的节点比深度小的值大,同一深度的右边大。所以为了得到最大值,可走最大深度的右边。左子树范围>=右子树范围。
思路:右边能一直平分的情况下要走左边,其他情况走右边,即是右边是2的n次方,这时右边是2的n次方加1,比右边多一层。
代码

import java.util.*;


public class Solution {
    /**
     * 
     * @param T int整型 
     * @param a int整型一维数组 
     * @return int整型一维数组
     */
    public int[] wwork (int T, int[] a) {
        // write code here
       int[] ans=new int[T];    
       for(int i=0;i<T;i++){
           int l=1;
           int r=a[i];
           int sum=1;
           while(l<r){
               int mid=(l+r)>>1;
               boolean fl=false;
               int left=mid-l+1;
               int right=r-mid;
               if(left>right){
                   int hh=right;
                   while(hh>0){
                       if((hh&1)==1)break;
                       if(hh==2){
                           fl=true;
                           break;
                       }
                       hh/=2;
                   }
               }
               if(fl||(left>right&&right==1)){
                   r=mid;
                   sum=sum*2;
               }
               else {
                   l=mid+1;
                   sum=sum*2+1;
               }
           }
           ans[i]=sum;
       }
       return ans;
    }
}
相关标签: 每日一题