美团秋招笔试第四场
第二题 种树 AC
import java.util.Arrays; import java.util.HashSet; import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { static int n,k; static int[] nums; public static void main(String[] args) { Scanner in = new Scanner(System.in); // n=in.nextInt(); // k=in.nextInt(); // nums=new int[n]; // for(int i=0;i<n;i++) // nums[i]=in.nextInt(); n=3;k=6;nums=new int[]{1,2,5}; Arrays.sort(nums); for(int i=0;i<n-1;i++){ nums[i]=nums[i+1]-nums[i]; } nums[n-1]=Integer.MAX_VALUE; //要找到一个最小值 可以用二分查找 最大是k 最小是1 int left=1,right=k,ans=k; while(left<=right){ int mid=(left+right)>>1; if(canDo(mid)){ ans=Math.min(ans,mid); right=mid-1; }else{ left=mid+1; } } System.out.println(ans); } private static boolean canDo(int cur){ //直接通过计算来判断能否成功 Long sum=0L; for(int i:nums){ sum+=Math.min(cur,i); } return sum>=k; } }
第三题 通过了测试用例,提交不通过
刚刚又本地改了、测了一下,现在我觉得没问题了(?)
import java.util.ArrayList; import java.util.List; import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { private static int getDist(int l,int r,List<Integer> index){ int dist=Integer.MAX_VALUE; for(int i:index){ if(i<l) dist=Math.min(dist,l-i); else if(i>r) { dist=Math.min(dist,i-r); break; } } return dist+r-l+1; } public static void main(String[] args) { Scanner in = new Scanner(System.in); // int n=in.nextInt(); // int q=in.nextInt(); // long[] nums=new long[n]; // long max=0; // for(int i=0;i<n;i++){ // nums[i]=in.nextLong(); // if(nums[i]>max){ // max=nums[i]; // } // } int n=7,q=2; long max=5; long[] nums=new long[]{1,1,4,5,1,4,5,5}; List<Integer> index=new ArrayList(); for(int i=0;i<n;i++){ if(nums[i]==max) index.add(i); } for(int i=0;i<q;i++){ int l=in.nextInt()-1; int r=in.nextInt()-1; //1.判断输赢。也就是判断最大值在不在l到r 2.求区间长度应该是多少 //列出所有情况。1必赢2平局3输了 int flag=0,qujian=n; for(int idx:index){ if(idx>=l&&idx<=r)//说明小团找到了一个最大值 { if(flag==1){//说明前面已经找到了一个落在这个区间的数字 flag=3;break; } if(index.size()>1) flag=1;//如果不止一个最大值,那么可以平局 else { flag = 2; break; } }else if(idx>=r) break; } //针对三种情况,分别求区间长度 if(flag==2){ System.out.println("lose"); //对方已经赢了 只需要加一 qujian=r-l+2; }else if(flag==0){ System.out.println("win"); //只需要找到和这个区间最近的index qujian=getDist(l,r,index); }else{ System.out.println("draw"); //为了平局,同样要找到最近的index if(flag==3) qujian=r-l+1; else qujian=getDist(l,r,index); } System.out.println(qujian); } } }#笔试##美团#