消灭兔子【贪心+堆】

2023-10-28

题目链接 51nod 1191 消灭兔子


  兔子这么可爱,怎么能消灭呢?

  我们可以用贪心的办法来解决这个问题,因为每个箭只能使用一次,所以,我们将兔子血量从高往低排列,先做掉高血量兔子,然后再看低血量兔子,保证了伤害高但是价值小的武器假如在之前没有用到过,但是在后面可能可以利用上,所以用优先队列存所有的可以用到的武器的价钱,升序。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f3f3f3f3f
#define eps 1e-8
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 5e4 + 7;
int N, M, Hp[maxN];
pair<int, int> P[maxN];
priority_queue<int, vector<int> , greater<int> > Q;
int main()
{
    scanf("%d%d", &N, &M);
    for(int i=1; i<=N; i++) scanf("%d", &Hp[i]);
    for(int i=1; i<=M; i++) scanf("%d%d", &P[i].first, &P[i].second);
    sort(Hp + 1, Hp + N + 1);
    sort(P + 1, P + M + 1);
    bool ok = true; ll ans = 0;
    for(int i = N, k = M; i; i--)
    {
        while(k && P[k].first >= Hp[i])
        {
            Q.push(P[k].second);
            k--;
        }
        if(Q.empty()) { ok = false; break; }
        ans += Q.top(); Q.pop();
    }
    if(ok) printf("%lld\n", ans);
    else printf("No Solution\n");
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消灭兔子【贪心+堆】 的相关文章

  • < 数据结构 > 堆的实现

    目录 1 前言 堆的概念 堆的结构 2 堆的实现 2 1 准备工作 创建堆结构 初始化堆 堆的打印 堆的销毁 2 2 堆调整 堆的交换 堆向上调整算法 堆向下调整算法 2 3 核心功能 堆的插入 堆的删除 堆的判空 获取堆的元素个数 获取堆
  • POJ--1328:Radar Installation (贪心)

    1 题目源地址 http poj org problem id 1328 2 解题思路 该题题意是为了求出能够覆盖所有岛屿的最小雷达数目 每个小岛对应x轴上的一个区间 在这个区间内的任何一个点放置雷达 则可以覆盖该小岛 区间范围的计算用 x
  • Pie POJ - 3122【贪心、二分】

    该题连接 这是一道英文题 所以这里就不放原题了 我写一下它的题意 主人要开一个party 而主人有N个派 他要宴请F个人 也就是要有F 1个人要吃派 但这些人又很挑剔 他们每个人吃派只吃一种派 并且还不能容忍其他人吃的派比自己多 所以这就是
  • Petya and Exam【Codeforces 1282 C】【贪心】

    Codeforces Round 610 Div 2 C 有N道题目 题目有简单与困难之分 简单的题目花费A分钟 困难的题目花费B分钟 那么考试时间一共有T的情况下 我们是可以提前交卷的 但是有些时间限制 就是譬如说你现在第x分钟交卷 但是
  • [NOI2010]超级钢琴【RMQ+贪心+堆】

    题目链接 超级棒的一道题 解这道题 需要分一下几步来看 取的是连续段 我们可以对每个可能起点去知道它的最大可能解 起点begin 最大可行解一定是begin L 1 begin R 1中的一个 如果每次都是取最大的话 那么下一个同起点的一定
  • 紫书《算法竞赛入门经典》

    紫书 算法竞赛入门经典 题目一览 第3章 数组和字符串 例题 UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 340 Master Mind Hints UVA 158
  • 第十三届蓝桥杯C B组 J:砍竹子

    思路 首先看数据范围 2e5 比较大 而且有一个不变的是 我们每次都从最高的竹子区间开始砍 那么每进行一次砍操作 接着还得再找出最高的竹子区间 代表要有多次排序 所以自然而然想到了一个数据结构 堆 想到 堆 思路就打开了 可以用pair存高
  • 【计蒜客——复赛A题】贝壳找房函数最值

    题意 对于结构 f x ax b 这样的一次函数 我们要做的就是 对 fi fj x ai ajx bj bi 这样的可换序嵌套函数求它的最大值f f f f x 接下来先分享一下令我忧伤的WA让大家快乐一下 include
  • JVM 内存模型

    内存划分 java虚拟机按照运行时内存使用区域划分如图 区域 是否线程共享 是否会内存溢出 程序计数器 否 不会 java虚拟机栈 否 会 本地方法栈 否 会 堆 是 会 方法区 是 会 一 程序计数器 Program Counter Re
  • 例说数据结构&STL(七)——priority_queue

    1 白话优先队列 priority queue 前面我们已经相继介绍了双向队列和FIFO特性的队列 这里我们还要接触另一个包含 队列 称呼的数据结构 优先队列 其实这三个数据结构名称看似很像 实则天差万别 通过下面的介绍你就会有很深的体会了
  • AcWing 104. 货仓选址

    题目 在一条数轴上有 N 家商店 它们的坐标分别为 A1 AN 现在需要在数轴上建立一家货仓 每天清晨 从货仓到每家商店都要运送一车商品 为了提高效率 求把货仓建在何处 可以使得货仓到每家商店的距离之和最小 输入格式 第一行输入整数N 第二
  • 优先队列(堆)

    设计一个程序模仿操作系统的进程管理问题 进 程服务按优先级高的先服务 同优先级的先到先服务的管理 原则 设文件task txt中存放了仿真进程服务请求 其中第 一列是进程任务号 第二列是进程的优先级 1 30 2 20 3 40 4 20
  • HDOJ1052

    先用最快马比 不行再用最慢马比 都不行 就送最慢马给忘得最快马 include
  • Stall Reservations POJ - 3190

    这道题 是学长给我们布置的学习用的题目 重在给我们讲解了什么是优先队列以及其对应的贪心问题 好了 先送上 中文翻译过的题意 手动 滑稽 Oh those picky N 1 lt N lt 50 000 cows They are so p
  • Educational Codeforces Round 67 (Rated for Div. 2)

    contest链接 A Stickers and Toys time limit per test 2 seconds memory limit per test 256 megabytes input standard input out
  • [leetcode] 358. Rearrange String k Distance Apart 解题报告

    题目链接 https leetcode com problems rearrange string k distance apart Given a non empty string str and an integer k rearran
  • Codeforces 1469 F. Power Sockets —— 二分+线段树,贪心

    This way 题意 现在有一个根节点 和n条包含a i 个节点的链 一开始所有点的颜色是白色的 你每次可以做以下操作 找到树中某个白色节点 拿出一条链 将这个节点和链上某个节点连接 并且这两个点的颜色变成黑色 之后这条链属于树中一个部分
  • BZOJ4868 [Shoi2017]期末考试

    YY一下的话感觉代价关于最晚出分时间是一个单峰函数 三分最晚的出分时间 然后贪心一下算代价就行 如果A gt B就只用B就行了 要不然的话出分时间小于当前限制的都可以随便往后调直到到达限制 那么先尽量用A 调不到限制以内的再用B即可 inc
  • 数据结构与算法-队列

    定义 队列是ListInsert发生表尾 ListDelete发生在表头的线性表 主要操作 入队 出队 术语 表头 队头 表尾 队尾 插入 入队 删除 出队 特点 先入先出 FIFO 插入的位置是length 1 删除的位置的是1 一般读取
  • BZOJ3425 Poi2013 Polarization

    最小值一定是n 1 每条边贡献一个答案 显然 首先我们要证明这道题的一个性质 最优解一定具有如下形式 以树的某一个重心 可以是任意一个 为根 根的每一个子树里的所有边要么都指向根 要么都指向叶子 引理 首先对于一棵树 我们把所有边的朝向反转

随机推荐