蓝桥杯第17169题——兽之泪II

问题描述

图片描述

在蓝桥王国,流传着一个古老的传说:在怪兽谷,有一笔由神圣骑士留下的宝藏。

小蓝是一位年轻而勇敢的冒险家,他决定去寻找宝藏。根据远古卷轴的提示,如果要找到宝藏,那么需要集齐 n 滴兽之泪,同时卷轴中也记载了,每击败一次怪物,就能够收集一滴兽之泪。

小蓝知道,这些怪物并非泛泛之辈,每一只都拥有强大的力量和狡猾的技巧。每一只怪物都有它独特的弱点和对策,小蓝必须谨慎选择战斗的策略和使用的能量。

在怪兽谷中,有 k 只怪兽。对于第 i 只怪兽,第一次击败他需要 xi​ 点能量,后续再击败他需要 yi​ 点能量。在挑战过程中,前 k−1 只怪兽可以随意挑战,但是第 k 只怪兽是怪兽之王,如果要挑战第 k 只怪兽,那么对于前 k−1 只怪兽都要击败至少一次

小蓝想知道,如果要集齐 n 滴兽之泪,那么至少需要多少能量。

输入格式

第一行包含一个整数 T(T≤105),代表测试组数。

每组数据包含如下部分:

第一行包含两个整数 k 和 n,表示怪物的数量和需要收集的兽之泪的数量。

2 ≤ k ≤ 10^5, 1 ≤ n ≤ 2 × 10^5。

接下来 k 行,每行包含两个整数 xi​ 和 yi​,表示第 i 只怪物第一次和后续击败所需的能量。

1 ≤ xi​, yi ​≤ 10^9。

保证 ∑k ≤ 10^5。

输出格式

对于每组数据,输出一个整数,表示小蓝至少需要多少点能量才能收集完成。

样例输入

1
3 4
2 2
4 2
1 1

样例输出

8

说明

注意,xi​,yi​ 并不保证谁大谁小。

一种可行的方案是:

  1. 第一次选择 1 号怪物,消耗能量 2。
  2. 第二次选择 2 号怪物,消耗能量 4。
  3. 由于 1,2 都已经击败一次,所以可以选择 3 号,第三次选择 3 号怪物,消耗能量 1。
  4. 第四次选择 3 号怪物,消耗能量 1。

另外一种方案是:

四次都选择 1 号怪兽,消耗的能量是 8。

解题思路

从数据量来看,解决该问题的时间复杂度不得达到O(N^2),使用二分的情况下满足时间复杂度要求,并且题目给出限制条件k的总和低于10^5,因此对每组数据进行排序是符合O(nlogn)的复杂度的,所以可以明确,此题可以使用排序、二分。

此题可以从游戏玩家的角度去思考打怪兽策略,由于一个怪兽可以多次打,那么我们肯定会想要多次去刷同一个y值消耗低的怪兽,以此刷满掉落物。

那么假设我们要一直刷的怪兽,扫荡消耗yi能量,那么首次击败所消耗的能量低于yi的怪兽就应当优先击败一次,这样可以在刷yi怪兽之前做到能量消耗最少。

我们会考虑到遍历每组数据的所有x值,其比yi小的记录到cost里,但这种方式并不会超时,但是会有另外的问题:如果比yi小的x值数量已经满足n滴眼泪的要求,我们就需要提前返回最小的n个x值总和,如果是乱序的,每次从第一个x开始遍历,那么就无法找到不考虑y只考虑x的最小能量消耗情况(也就是只挑选部分怪兽打一次就够了的情况,无法计算出最小的x总和)

所以既然排序是允许的,那么我们干脆对每组数据的x先进行排序,并使用pre数组对x做前缀和的预计算,那么在上述提到的特例情况中,就可以直接返回pre[n]的值即可。

排序之后我们会想到一个这样的做法,但它是错的:我们遍历每一个怪兽,定义其序号为j,先刷完1到j每个怪兽1次,最后不够的再刷第j个怪兽。这个方法错误的原因在于,对于一个较大的x,可能会有一个相当小的y,直白的说,帅怪的顺序可能是x1,x2,x5,y5,y5,y5……在这个可能的策略中,我们跳过了x3和x4没有刷,这种情况是有可能发生的,所以这个方法是不可行的。

最终我们的做法是,对每组数据的每个y进行枚举,考虑最后无限刷的怪兽多次击败的能量消耗是y,期间使用二分法配合前缀和计算出刷它之前需要刷的其他怪兽能量消耗,就可以找到最小的答案。

import java.util.*;
import java.io.*;

public class Main{
    public static Pair[] pairs;
    public static long[] pre;
    public static int k, n;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while (T-- > 0) {
            k = sc.nextInt();
            n = sc.nextInt();
            pairs = new Pair[k + 1];
            pre = new long[k + 1];
            for (int i = 1; i <= k; i++) {
                int x = sc.nextInt();
                int y = sc.nextInt();
                pairs[i] = new Pair(x, y);
            }
            // 对pairs数组的[1, k-1]进行排序,避免0下标的空指针问题
            // 第k个怪兽的x再小也不可以提前刷,必须维持在最后的位置
            Arrays.sort(pairs, 1, k, Comparator.comparing((Pair p) -> p.x));
            // 对于刷满k个怪兽的情况,后续不够的兽之泪可以刷y最小的那只怪兽
            long minY = Integer.MAX_VALUE;
            for (int i = 1; i <= k; i++) {
                pre[i] = pre[i - 1] + pairs[i].x;
                minY = Math.min(minY, pairs[i].y);
            }
            long ans = solveK(minY);
            for (int i = 1; i < k; i++) {
                ans = Math.min(ans, solve(i));
            }
            System.out.println(ans);
        }
    }

    public static long solveK(long minY) {
        long cost = pre[k];
        long tear = k;
        cost += Math.max(0, n - tear) * minY;
        return cost;
    }

    public static long solve(int yi) {
        Pair p = pairs[yi];
        // 此结构的二分下,最后的right是满足if表达式的最大下标
        int left = 1, right = k;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (pairs[mid].x < p.y) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        // 如果根本不需要刷那么多,就返回pre[n]提前结束
        if (right >= n) {
            return pre[n];
        }
        long cost = pre[right];
        long tear = right;
        // 如果yi对应的x没有杀过,就单独处理一下
        if (right < yi) {
            cost += p.x;
            tear++;
        }
        cost += Math.max(0, n - tear) * p.y;
        return cost;
    }
}

class Pair {
    int x, y;

    public Pair(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565855.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NFTScan | 04.15~04.21 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.04.15~ 2024.04.21 NFT Hot News 01/ 数据&#xff1a;Bitcoin Puppets 市值超越 Pudgy Penguins&#xff0c;现排名第五 4 月 15 日&#xff0c;据 CoinGecko 数据显示&#xff0c…

LeetCode in Python 72. Edit Distance (编辑距离)

编辑距离的基本思想很直观&#xff0c;即不断比较两个单词每个位置的元素&#xff0c;若相同则比较下一个&#xff0c;若不同则需要考虑从插入、删除、替换三种方法中选择一个最优的策略。涉及最优策略笔者最先想到的即是动态规划的思想&#xff0c;将两个单词的位置对应放在矩…

zigbee cc2530的室内/矿井等定位系统RSSI原理

1. 定位节点软件设计流程 2. 硬件设计 cc2530 最小系统 3. 上位机 c# 设计上位机&#xff0c;通过串口连接协调器节点&#xff0c;传输数据到pc上位机&#xff0c;显示节点坐标信息 4. 实物效果 需要4个节点&#xff0c;其中一个协调器&#xff0c;两个路由器作为参考节点&a…

计算机视觉 | 交通信号灯状态的检测和识别

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在使用计算机视觉技术检测交通信号灯的状态&#xff0c;主要针对红色和绿色信号灯的识别。通过分析输入图像中的像素颜色信息&#xff0c;利用OpenCV库实现对信号灯状态的检测和识别。 目录 一、项目背景 二、项目功能…

uni-app 的 扩展组件(uni-ui) 与uView UI

uni-app 的 扩展组件&#xff08;uni-ui&#xff09; 与uView UI uni-ui 官方背景&#xff1a;组件集&#xff1a;设计风格&#xff1a;文档与支持&#xff1a;社区与生态&#xff1a; uView UI 第三方框架&#xff1a;组件集&#xff1a;设计风格&#xff1a;文档与支持&#…

Python --- 新手小白自己动手安装Anaconda+Jupyter Notebook全记录(Windows平台)

新手小白自己动手安装AnacondaJupyter Notebook全记录 这两天在家学Pythonmathine learning&#xff0c;在我刚刚入手python的时候&#xff0c;我写了一篇新手的入手文章&#xff0c;是基于Vs code编译器的入手指南&#xff0c;里面包括如何安装python&#xff0c;以及如何在Vs…

四六级英语听力考试音频无线发射系统在安顺学院的成功应用分析

四六级英语听力考试音频无线发射系统在安顺学院的成功应用分析 由北京海特伟业科技任洪卓发布于2024年4月22日 安顺学院为了提高学生的外语听力水平&#xff0c;并确保英语四六级听力考试的稳定可靠进行&#xff0c;决定对传统的英语听力音频传输系统进行改造&#xff0c;以提供…

海康Visionmaster-常见问题排查方法-启动阶段

VM试用版启动时&#xff0c;弹窗报错&#xff1a;加密狗未安装或检测异常&#xff1b;  问题原因&#xff1a;安装VM 的时候未选择软加密&#xff0c;选择了加密狗驱动&#xff0c;此时要使用软授权就出现了此现象。  解决方法&#xff1a; ① 首先确认软加密驱动正确安装…

单片机 VS 嵌入式LInux (学习方法)

linux 嵌入式开发岗位需要掌握Linux的主要原因之一是&#xff0c;许多嵌入式系统正在向更复杂、更功能丰富的方向发展&#xff0c;需要更强大的操作系统支持。而Linux作为开源、稳定且灵活的操作系统&#xff0c;已经成为许多嵌入式系统的首选。以下是为什么嵌入式开发岗位通常…

机器学习-10-神经网络python实现-从零开始

文章目录 总结参考本门课程的目标机器学习定义从零构建神经网络手写数据集MNIST介绍代码读取数据集MNIST神经网络实现测试手写的图片 带有反向查询的神经网络实现 总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍基于python实现神经网络。 参考 BP神经网络及pytho…

数据挖掘实验(Apriori,fpgrowth)

Apriori&#xff1a;这里做了个小优化&#xff0c;比如abcde和adcef自连接出的新项集abcdef&#xff0c;可以用abcde的位置和f的位置取交集&#xff0c;这样第n项集的计算可以用n-1项集的信息和数字本身的位置信息计算出来&#xff0c;只需要保存第n-1项集的位置信息就可以提速…

去哪儿网开源的一个对应用透明,无侵入的Java应用诊断工具

今天 V 哥给大家带来一款开源工具Bistoury&#xff0c;Bistoury 是去哪儿网开源的一个对应用透明&#xff0c;无侵入的java应用诊断工具&#xff0c;用于提升开发人员的诊断效率和能力。 Bistoury 的目标是一站式java应用诊断解决方案&#xff0c;让开发人员无需登录机器或修改…

microk8s拉取pause镜像卡住

前几天嫌服务器上镜像太多占空间&#xff0c;全部删掉了&#xff0c;今天看到 microk8s 更新了 1.30 版本&#xff0c;果断更新&#xff0c;结果集群跑不起来了。 先通过 microk8s.kubectl get pods --all-namespaces 命令看看 pod 状态。 如上图可以看到&#xff0c;所有的业…

物联网通信中NB-IoT、Cat.1、Cat.M该如何选择?

物联网通信中NB-IoT、Cat.1、Cat.M该如何选择? 参考链接:物联网通信中NB-IoT、Cat.1、Cat.M该如何选择?​​ 在我们准备设计用于大规模联网的物联网设备时,选择到适合的LTE IoT标准将是我们遇到的难点。这是我们一开始设计产品方案就需要解决的一个问题,其决定我们设备需…

HarmonyOS ArkUI实战开发-NAPI 加载原理(下)

上一节笔者给大家讲解了 JS 引擎解释执行到 import 语句的加载流程&#xff0c;总结起来就是利用 dlopen() 方法的加载特性向 NativeModuleManager 内部的链接尾部添加一个 NativeModule&#xff0c;没有阅读过上节文章的小伙伴&#xff0c;笔者强烈建议阅读一下&#xff0c;本…

ChatGPT在线网页版(与GPT Plus会员完全一致)

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

【PostgreSQL】Postgres数据库安装、配置、使用DBLink详解

目录 一、技术背景1.1 背景1.2 什么是 DBLink 二、安装配置 DBLink2.1 安装 DBLink2.2 配置 DBLink1. 修改 postgresql.conf2. 修改 pg_hba.conf 三、DBLink 使用3.1 数据准备3.2 DBLink 使用1. 创建 DBLink 连接2. 使用 DBLink 进行查询3. 使用 DBLink 进行增删改4. 使用 DBLi…

第G8周:ACGAN任务

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 参考论文 这周主要任务就是根据之前GAN&#xff0c;CGAN&#xff0c;SGAN网络架构搭建…

照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成

✨ 1: Magic Clothing Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上 Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上。通过使用Magic Clothing&#xf…

CountDownLatch倒计时器源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. CountDownLatch有什么用 3. CountDownLatch底层原理 3.1. count…