美团秋招笔试第四场

第二题 种树 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);
        }

    }
}

#笔试##美团#
全部评论
第二题优先队列过的 Arrays.sort(arr); Queue<integer> q = new PriorityQueue<>(); for(int i = 1;i<n>0){ int x = q.peek(); if(x*q.size()</n></integer>
点赞 回复 分享
发布于 2024-09-01 12:23 广东
你笔试状态变了吗,我还是待笔试状态
点赞 回复 分享
发布于 2024-09-01 09:36 广西
同第三题没改好
点赞 回复 分享
发布于 2024-08-31 20:35 湖北
跟你差不多,感觉这分过不了,填了14号第二次的再刷刷分
点赞 回复 分享
发布于 2024-08-31 20:35 浙江
第二题我二分为啥才80%
点赞 回复 分享
发布于 2024-08-31 20:34 浙江

相关推荐

04-21 11:22
已编辑
中华女子学院 UE4
点赞 评论 收藏
分享
VirtualBool:都去逗他了?
点赞 评论 收藏
分享
评论
3
10
分享

创作者周榜

更多
牛客网
牛客企业服务