度小满笔试 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; } } }
总体来说,度小满不收人了吧,偏简单