阿里巴巴实习生【四月一日】笔试题
两题
这次真的有点简单,不用DP就能过(不会DP的我暗自开心)。
1.暴力题
给定T个“01”字符串,定义翻转:0->1,1->0,每一次翻转会将翻转本位置和相邻(间隔为1)的位置的字符,问最少需要多少次翻转才能变成全为0的字符串,无法全0输出NO
如“011”->"000",翻转下标为2(从零开始)的位置就能变成全0串,答案为1
T<=100
len(字符串)<=20
思路:
这个题直接位运算暴力即可
2.贪心题
有n个怪物,每个怪物有一定的血量,你有m支箭,每支箭有伤害值和花费,每个怪物只能中一箭,当伤害值大于等于怪物的血量怪物就被消灭,
问消灭全部怪物的最小花费是多少,如果不能全部消灭输出NO。
有T组数据
每组数据中
两个整数n,m,n是怪物的数量,m是箭的数量
下面有三行
数组a[n] n个数 ,代表怪物的血量
数组b[m] m个数 , 代表箭的伤害值
数组c[m] m个数 ,代表箭的花费
思路:
从大到小遍历怪物血量
每次判断杀死怪物前,将伤害值大于等于当前怪物血量的箭加入到优先队列中(花费越小,优先级越高)
如果优先队列不为空,选取队顶的箭并出队,将其花费加入到答案中
如果优先队列为空,则这个怪物无法被杀死,输出no
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.lang.reflect.Array; import java.util.Arrays; import java.util.PriorityQueue; import java.util.Scanner; /** * @Author: Shang Huaipeng * @Version 1.0 */ import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); int a[]=new int[100000+10]; int b[]=new int[100000+10]; int c[]=new int[100000+10]; for(int k=0;k<T;k++) { int n=sc.nextInt(); int m=sc.nextInt(); PriorityQueue<int[]> que1 = new PriorityQueue<int[]>((a1,a2)->{//[0]伤害[1]费用 if(a1[0]!=a2[0])return a2[0]-a1[0]; else return a1[1]-a2[1]; }); PriorityQueue<int[]> que2 = new PriorityQueue<>((a1,a2)->{//费用小的优先级高 if(a1[1]!=a2[1])return a1[1]-a2[1]; else return a1[0]-a2[0]; }); for(int i=0;i<n;i++){ a[i]=sc.nextInt(); } for(int i=0;i<m;i++){ b[i]=sc.nextInt(); } for(int i=0;i<m;i++){ c[i]=sc.nextInt(); que1.offer(new int[]{b[i],c[i]}); } Arrays.sort(a,0,n); long ans=0; for(int i=n-1;i>=0;i--){ while(!que1.isEmpty()&&que1.peek()[0]>=a[i]){ que2.offer(que1.poll()); } if(que2.isEmpty()){ ans=-1; break; } else ans+=que2.poll()[1]; } if(ans==-1) System.out.println("No"); else System.out.println(ans); } } }#阿里巴巴笔试##阿里巴巴##笔试题目#