牛客网NC30-20.8.05-树,贪心
程序员文章站
2024-02-12 22:41:40
...
题目链接:NC30
题意、输入、输出:
分析:对于题叙述的构造方法,一颗树,深度大的节点比深度小的值大,同一深度的右边大。所以为了得到最大值,可走最大深度的右边。左子树范围>=右子树范围。
思路:右边能一直平分的情况下要走左边,其他情况走右边,即是右边是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;
}
}
上一篇: 牛客网NC46-20.8.7-贪心
下一篇: Unity Shader镜面效果