贪心,队列,运算符重载,牛客:连环爆炸

C-连环爆炸_第四届辽宁省大学生程序设计竞赛(正式赛)(重现赛)@兴安真人 (nowcoder.com)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

星穹铁道,启动!

希儿打怪,对面是n个自爆怪。每个怪有ai​和bi​两个参数,ai​代表这个怪物的血量,bi​代表这个怪物身亡后自爆对所有单体怪物造成的伤害。


你可以选择任意怪物,进行“手动消灭”,将其血量变为0。

当一个怪物由于“手动消灭”或其他怪物的自爆,血量变为0及0以下,则该怪物被消灭,并对所有单体怪物造成bi​的伤害。

问最少“手动消灭”几个怪物能消灭所有怪物。

注意:这些怪是可以通过怪的自爆连续引爆的。

输入描述:

第一行一个正整数n,表示怪物的数量。接下来的n行,每行两个正整数ai​和bi​。(ai​代表这个怪物的血量,bi​代表这个怪物身亡后自爆对所有单体怪物造成的伤害)1≤n≤40001≤ai≤10000000001≤bi≤250000

输出描述:

输出一个正整数,表示能消灭所有怪物的最少使用“手动消灭”的次数。

示例1

输入

复制5 4 2 6 2 7 2 8 2 10 2

5
4 2
6 2
7 2
8 2
10 2

输出

复制2

2

示例2

输入

复制5 4 2 6 2 7 100 8 2 10 2

5
4 2
6 2
7 100
8 2
10 2

输出

复制1

1

解析:

 

1.首先,想明白杀怪的最优解。需要筛选出一定不能被炸死的怪(即所有怪爆炸伤害之和减去该怪的爆炸伤害<该怪的生命值),手动将它杀死,积累伤害值。这一步非常重要!!!!

2.剩余的都是可以被炸死的怪,可以放心地按爆炸伤害从高到低的顺序杀(注意伤害相等时先杀生命值高的),每杀一个,积累伤害值,需要找到目前伤害可以炸死的怪物,因此想到还需要一个按生命值从小到大排序的数据结构。可以知道此时怪物死到哪里了,不需要死一个怪再判断其他的怪物是否有被炸死的。

 

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>using namespace std;
typedef long long LL;
const int N = 4e3 + 5;
int n;
struct node {LL a, b;int flg = 0;
}arr[N];int cmp(const struct node& a, const struct node& b) {if (a.b == b.b)return a.a > b.a;return a.b > b.b;
}int main() {cin >> n;LL num = 0;for (int i = 1; i <= n; i++) {scanf("%lld%lld", &arr[i].a, &arr[i].b);num += arr[i].b;}sort(arr + 1, arr + 1 + n, cmp);LL sum = 0,cnt=0;int ff = 0;for (int i = 1; i <= n; i++) {if (num - arr[i].b < arr[i].a) {sum += arr[i].b;arr[i].flg = 1;cnt++;}}ff = 1;for (int i = 1; i <= n; i++) {//cout << cnt << endl;while (ff) {ff = 0;for (int j = n; j > 0; j--) {if (arr[j].a <= sum && arr[j].flg == 0) {sum += arr[j].b;arr[j].flg = 1;ff = 1;}}}if (arr[i].flg == 0) {arr[i].flg = 1;sum += arr[i].b;cnt++;ff = 1;}}cout << cnt << endl;return 0;
}

队列版:

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>using namespace std;
typedef long long LL;
const int N = 4e3 + 5;
int n;
LL s[N][2],fg[N];
struct ss {int index;LL a, b;bool operator <(const ss& t)const {if (b == t.b)return a < t.a;return b < t.b;}
};struct ll {int index;LL a, b;bool operator<(const ll& t)const {return a > t.a;}
};priority_queue<ss>q1;
priority_queue<ll>q2;int main() {cin >> n;int sum = 0;for (int i = 1; i <= n; i++) {scanf("%lld%lld",&s[i][0],&s[i][1]);sum += s[i][1];}int cnt = 0, su = 0;for (int i = 1; i <= n; i++) {fg[i] = 1;}for (int i = 1; i <= n; i++) {if (sum - s[i][1] < s[i][0]) {su += s[i][1];cnt++;fg[i] = 0;}else {q1.push({ i,s[i][0],s[i][1] });q2.push({ i,s[i][0],s[i][1] });}}while (!q1.empty() && !q2.empty()) {while (!q2.empty()&&su>=q2.top().a) {if(fg[q2.top().index])su += q2.top().b;fg[q2.top().index] = 0;q2.pop();}if (q2.empty())break;while (!q1.empty()&&fg[q1.top().index]==0) {q1.pop();}if (q1.empty())break;cnt++;su += q1.top().b;fg[q1.top().index] = 0;q1.pop();}cout << cnt << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考高级系统架构设计师系列案例考点专题六:面向服务架构设计

软考高级系统架构设计师系列案例考点专题六:面向服务架构设计 一、面向服务架构设计内容大纲二、SOA概述和发展三、SOA和微服务的区别四、SOA的参考架构五、SOA主要协议和规范六、SOA设计标准和原则七、SOA设计模式八、SOA构建和实施一、面向服务架构设计内容大纲 SOA概述和发…

C++ [继承]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT 继承 前言正文继承的概念及定义继承的概念继承的定义重定义 基类和派生类对象赋值转换派生类中的默认成员函数隐式调用显示调用 继承中的友元与静态成员友元静态成员 菱形继承概念 虚继承原理继…

java中对象的引用是什么?

引用和指向 例如&#xff1a; new Student(); 代表创建了一个Student对象&#xff0c;但是也仅仅是创建了一个对象&#xff0c;没有办法访问它。 为了访问这个对象&#xff0c;会使用引用来代表这个对象 Student s new Student(); s这个变量是Student类型&#xff0c;又叫做引…

react组件通信

目录 前言&#xff1a; 父子组件通信 子父组件通信 兄弟组件通信 总结 前言&#xff1a; React是一种流行的JavaScript库&#xff0c;用于构建现代化的、高性能的Web应用程序。在React中&#xff0c;组件是代码的构建块。组件通信是React中一个非常重要的概念&#xff0c;…

Kafka反序列化RCE漏洞(CVE-2023-34040)

漏洞描述 Spring Kafka 是 Spring Framework 生态系统中的一个模块&#xff0c;用于简化在 Spring 应用程序中集成 Apache Kafka 的过程&#xff0c;记录 (record) 指 Kafka 消息中的一条记录。 受影响版本中默认未对记录配置 ErrorHandlingDeserializer&#xff0c;当用户将…

Bean的四种实例化方式以及BeanFactory和FactoryBean的区别

2023.11.8 Spring为Bean提供了多种实例化方式&#xff0c;通常包括4种方式。 第一种&#xff1a;通过构造方法实例化第二种&#xff1a;通过简单工厂模式实例化第三种&#xff1a;通过factory-bean实例化第四种&#xff1a;通过FactoryBean接口实例化 通过构造方法实例化 创…

android display 笔记(三)WMS

用来记录学习wms&#xff0c;后续会一点一点更新。。。。。。 代码&#xff1a;android14 WMS是在SystemServer进程中启动的 在SystemServer中的main方法中&#xff0c;调用run方法。 private void run() { // Initialize native services.初始化服务&#xff0c;加载andro…

FreeRTOS_空闲任务

目录 1. 空闲任务详解 1.1 空闲任务简介 1.2 空闲任务的创建 1.3 空闲任务函数 2. 空闲任务钩子函数详解 2.1 钩子函数 2.2 空闲任务钩子函数 3. 空闲任务钩子函数实验 3.1 main.c 空闲任务是 FreeRTOS 必不可少的一个任务&#xff0c;其他 RTOS 类系统也有空闲任务&a…

广东开放大学:电大搜题助力学子迎考利器

近年来&#xff0c;广东开放大学一直致力于为广大学子提供优质的教育资源和学习服务。作为一所专注于远程教育的学府&#xff0c;广东开放大学不仅拥有雄厚的师资力量和丰富的教育经验&#xff0c;还致力于创新教学手段&#xff0c;为学生提供更便捷、高效的学习体验。在这个信…

c#,字段和属性的区别

c#,string test和string test{ges;set;}有什么区别 在C#中&#xff0c;string test和string test { get; set; }表达了两种不同的成员声明&#xff0c;它们在类中的作用和访问方式是不同的。 string test: 这是一个字段&#xff08;field&#xff09;声明。它声明了一个类型…

【Qt之QSequentialIterable】使用

介绍 QSequentialIterable类是一个容器在QVariant中的可遍历接口。该类允许多种方法来访问存储在QVariant中容器的元素。如果一个QVariant可以转换为QVariantList&#xff0c;那么可以从其中提取出QSequentialIterable的实例。 QList<int> intList {7, 11, 42};QVarian…

2023年11月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年11月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

08.Diffusion Model数学原理分析(上)

文章目录 Diffusion Model回顾Diffusion Model算法TrainingInference 图像生成模型的本质目标MLE vs KLVAE计算 P θ ( x ) P_\theta(x) Pθ​(x)Lower bound of log ⁡ P ( x ) \log P(x) logP(x) DDPM计算 P θ ( x ) P_\theta(x) Pθ​(x)Lower bound of log ⁡ P ( x ) \…

数据结构与算法-(11)---有序表(OrderedList)

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON学习系列专栏 &#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 知识回顾及总结 有序表的引入 ​编辑 实现有序表 1.有序表-类的构造方法 2.有序表-search方法的实现 3.有序表-add方法的实现…

ArrayList和LinkedList的区别有哪些?

ArrayList 和 LinkedList 是 Java 中常用的两种集合类&#xff0c;它们之间有一些重要的区别&#xff0c;主要涉及到其内部实现和性能特点&#xff1a; 内部实现&#xff1a; ArrayList 是基于动态数组实现的。它使用一个数组来存储元素&#xff0c;当数组已满并需要添加新元素…

【技术类-01】doc转PDF程序卡死的解决方案,

摘要&#xff1a; 1、出现 raise AttributeError("%s.%s" % (self._username_, attr))&#xff09; 2、表现&#xff1a;doc转PDF卡死&#xff08;白条不动或出现以上英文&#xff09; 3、解决&#xff1a;在docx保存代码行后面加上time.sleep(3) 4、原因&#x…

SpringBoot系列之集成Redission入门与实践教程

Redisson是一款基于java开发的开源项目&#xff0c;提供了很多企业级实践&#xff0c;比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用 软件环境&#xff1a; JDK 1.8 SpringBoot 2.2.1 Maven 3.2…

Leetcode刷题【hot100】两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

Java进阶篇--线程池之FutureTask

目录 FutureTask简介 FutureTask的基本使用 FutureTask的应用场景 FutureTask简介 FutureTask是Java中的一个类&#xff0c;用于表示可获取结果的异步任务。它实现了java.util.concurrent.Future接口&#xff0c;提供了启动和取消异步任务、查询任务是否已完成以及获取最终…

虚拟机 smbus host controller not enabled

虚拟机空间不足 -> 扩展磁盘容量 -> 系统自动安装或启用了i2c_piix4模块 按住shift重新启动