蓝桥杯算法——铠甲合体

问题描述

暗影大帝又开始搞事情了!这次他派出了 MM 个战斗力爆表的暗影护法,准备一举摧毁 ERP 研究院!MM 个暗影护法的战斗力可分别用 B1,⋯,BMB1​,⋯,BM​ 表示。

ERP 研究院紧急召唤了 NN 位铠甲勇士前来迎战!每位铠甲勇士都拥有强大的能量,能量值分别为 A1,⋯,ANA1​,⋯,AN​。这些能量值之间存在着某种特殊的联系:任意两位铠甲勇士的能量值,其中一个总是另一个的整数倍。

例如,可能存在能量值分别为 1,2,4,81,2,4,8 的铠甲勇士,但绝不会出现能量值分别为 22 和 33 的铠甲勇士。

为了击败暗影护法,铠甲勇士们需要进行合体,将自身的能量组合起来。当合体后的能量总和恰好等于护法的战斗力时,就能将其击败。 现在,ERP 研究院需要你的帮助!对于每个暗影护法,请你计算出需要多少个铠甲勇士合体才能击败他。如果无论如何都无法击败,那就暂时撤退!

输入格式

第一行输入两个整数 NN 和 MM (1≤N,M≤1051≤N,M≤105),分别表示铠甲勇士的数量和暗影护法的数量。

第二行输入 NN 个整数 A1,A2,...,ANA1​,A2​,...,AN​ (1≤Ai≤10101≤Ai​≤1010),表示每个铠甲勇士的能量值。

第三行输入 MM 个整数 B1,B2,...,BMB1​,B2​,...,BM​ (1≤Bi≤10101≤Bi​≤1010),表示每个暗影护法的战斗力。

输出格式

输出一行,包含 MM 个整数,分别表示击败每个暗影护法所需的最少合体个数;如果无法击败则输出 −1−1。

样例输入

复制代码
3 2
2 2 2
6 3

样例输出

复制代码
3 -1

答案

java 复制代码
import java.util.*;
import java.util.function.BiFunction;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int N = scan.nextInt();
        int M = scan.nextInt();
        //对铠甲勇士的数据进行记录
        TreeMap<Long,Integer> map = new TreeMap<>((o1, o2) -> {
            //对勇士的数值进行排序(底层用的堆,设置好排序规则后不用管)
            if (o2 - o1 > 0) return 1;
            if (o2.equals(o1)) return 0;
            else return -1;
        });
        int[] res = new int[M];
        for (int i = 0;i < N;i++){
            map.merge(scan.nextLong(), 1, (o,n) -> o + 1);
        }
        for (int i = 0;i < M;i++){
            Long curr = scan.nextLong();
            for (Map.Entry<Long,Integer> entry : map.entrySet()) {
                //解题思路
                //从大到小进行判断,key是当前的勇士能量,val是勇士的个数
                //curr / entry.getKey()是如果用该勇士处理护法,需要多少个
                //map.get(entry.getKey())是当前勇士的个数
                //判断当前勇士个数和所需勇士个数哪个小,就给结果上加几(若勇士多于所需,则没必要使用完,若不够,则要全部使用)
                res[i] += Math.min(map.get(entry.getKey()),curr / entry.getKey());
                //当前勇士消弱护法的数值
                curr -= entry.getKey() * Math.min(map.get(entry.getKey()),curr / entry.getKey());
                //继续用数值小的勇士进行尝试
            }
            //为了防止取模后curr不为0(比如护法为17,勇士为8,8,4,最后会剩下1)
            res[i] = curr.equals(0L) ? res[i] : -1;
        }
        //蓝桥杯的输出格式那里MVP,算法躺赢狗
        StringBuilder sb = new StringBuilder();
        for (int i : res) {
            sb.append(i).append(" ");
        }
        System.out.println(sb.toString());
        scan.close();
    }
}

结果

相关推荐
1 分钟前
3D碰撞检测系统 基于SAT算法+Burst优化(Unity)
算法·3d·unity·c#·游戏引擎·sat
Tony沈哲7 分钟前
OpenCV 图像调色优化实录:基于图像金字塔的 RAW / HEIC 文件加载与调色实践
opencv·算法
我就是全世界35 分钟前
Faiss中L2欧式距离与余弦相似度:究竟该如何选择?
算法·faiss
boyedu38 分钟前
比特币运行机制全解析:区块链、共识算法与数字黄金的未来挑战
算法·区块链·共识算法·数字货币·加密货币
KarrySmile1 小时前
Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
算法·链表·面试·双指针法·虚拟头结点·环形链表
花开富贵ii1 小时前
代码随想录算法训练营二十八天|动态规划part01
java·数据结构·算法·leetcode·动态规划
啊阿狸不会拉杆1 小时前
《Java 程序设计》第 7 章 - 继承与多态
java·开发语言·jvm·算法·intellij-idea
测试19982 小时前
cmake应用:集成gtest进行单元测试
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
Deng9452013142 小时前
数独求解器与生成器(回溯算法实现)
算法·图形用户界面·matlab技术·数独谜题·求解器与生成器
淦暴尼2 小时前
银行客户流失预测分析
python·深度学习·算法