度小满笔试 64 100第一题欢迎大家指出问题

顺便黑一下猿辅导,觉得我10分钟不到解出算法题不够快哦

1. 从天而降(是不是后台测试例子答案错了,我感觉我没错啊)
第一行输入n,
第二行n个正整数 表示敌人血量
当处于位置x时放技能,可以对 x, 2*x,2*x+1的敌人同时造成一点伤害,求至少多少次技能可以消灭敌人
import java.util.*;

public class Main{

    public static  void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int[] a=new int[n+1];
        for(int i=1;i<=n;i++)
            a[i]=in.nextInt();
        long sum=0;
        for(int i=n;i>=1;i--){
            int num;
            if(i%2==1){
                int x=(i-1)/2;
                num=Math.max(a[i],a[i-1]);
                a[x]-=num;
                a[i]=0;a[i-1]=0;
                if(a[x]<0)
                    a[x]=0;
                i--;
            }else{
                int x=i/2;
                a[x]-=a[i];
                num=a[i];
                a[i]=0;
                if(a[x]<0)
                    a[x]=0;

            }
            sum+=num;
           /* System.out.println();
            for(int j=1;j<=n;j++)
                System.out.print(a[j]+" ");*/
        }
        System.out.println(sum);

    }
}
2.  忘了题目了,大概是给出桥限重limit,给出车子重量w,车子过桥时间,第i+1辆车不能早于第i辆车 上桥,求所有车的过桥时间
思路:用一个优先级队列维持当前桥上的车子,比较的是下车时间  ,当桥上重量<=limit 上桥,车子的下车时间为已花费时间+过桥时间, 当大于时,车子下车,更新已花费的时间为车子下车时间
import java.util.*;

public class Main{

    public static  void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();int limit=in.nextInt();
        Car[] cars=new Car[n];
        for(int i=0;i<n;i++)
            cars[i]=new Car(in.nextInt(), 0);
        for(int i=0;i<n;i++)
            cars[i].t=in.nextInt();
        PriorityQueue<Car> list=new PriorityQueue<>((o1,o2)->o1.compare(o2));
        int sum=0,cur=0;
        for(int i=0;i<n;){
            if(cur+cars[i].w<=limit){
                cars[i].t+=sum;
                list.offer(cars[i]);
                cur+=cars[i].w;
                i++;
            }else{
                Car  car=list.poll();
                sum=car.t;
                cur-=car.w;
                while (list.size()>0 &&list.peek().t==sum){
                    car=list.poll();
                    cur-=car.w;
                }
            }
        }
        while (list.size()>0){
            sum=list.poll().t;
        }
        System.out.println(sum);


    }
    static  class Car{
        int w;
        int t;
        public Car(int w, int t) {
            this.w = w;
            this.t = t;
        }
        public  int compare(Car o){
            return  this.t-o.t;
        }
    }

}

总体来说,度小满不收人了吧,偏简单

#度小满##笔试题目#
全部评论
招的是能写出第三题的。。
点赞
送花
回复
分享
发布于 2019-09-29 20:40
能不能简单说下第二题的思路
点赞
送花
回复
分享
发布于 2019-09-29 20:38
滴滴
校招火热招聘中
官网直投
给大佬递烟
点赞
送花
回复
分享
发布于 2019-09-29 20:39
第一题我思路跟你差不多,也是64
点赞
送花
回复
分享
发布于 2019-09-29 20:39
攻击范围是123 245 367 489.. 是不是对于123 45 67 89...分别求最大值相加就可以了?
点赞
送花
回复
分享
发布于 2019-09-29 20:39
一样,第一题搞不懂哪里有问题
点赞
送花
回复
分享
发布于 2019-09-29 20:41
强,,,mark
点赞
送花
回复
分享
发布于 2019-09-29 20:41
因为满足前面三元组的最大值的话 后面三元组的第一位肯定也是满足了的
点赞
送花
回复
分享
发布于 2019-09-29 20:41
插眼 等第一题
点赞
送花
回复
分享
发布于 2019-09-29 20:42

相关推荐

2 25 评论
分享
牛客网
牛客企业服务