阿里巴巴实习生【四月一日】笔试题

两题
这次真的有点简单,不用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);
        }
    }
}
#阿里巴巴笔试##阿里巴巴##笔试题目#
全部评论
哇,大佬,0 分菜鸡路过
点赞 回复 分享
发布于 2020-04-01 17:14
楼主能说一下第一题的具体思路吗
点赞 回复 分享
发布于 2020-04-01 17:55
楼主太强了
点赞 回复 分享
发布于 2020-04-01 18:15
请问楼主,阿里笔试,都是这种一行一行输入吗?入参只能通过Scanner来获取吗?
点赞 回复 分享
发布于 2022-03-01 14:35

相关推荐

totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
评论
2
9
分享
牛客网
牛客企业服务