消灭兔子【贪心+堆】

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(使用前将#替换为@)

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

  • 区间图着色问题

    这是算法导论贪心算法一章的一个习题 题目描述 假定有一组活动 我们需要将它们安排到一些教室 任意活动都可以在任意教室进行 我们希望使用最少的教室完成所有的活动 设计一个高效的贪心算法求每个活动应该在哪个教室进行 这个问题称为区间图着色问题
  • 利用完全二叉树的性质,如何创建一个大根堆和一个小根堆?

    大根堆 大根堆 每个结点的值不大于他的父亲结点的值 分析如下 假设对 27 15 19 18 28 34 65 49 25 37 这样一个集合的数据创建成堆 代码如下 建立大根堆 public class TestHeap public i
  • Best Binary String

    Best Binary String 题意 给一个包含0 1 的字符串 可以换成0或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中的一个 如果每次都是取最大的话 那么下一个同起点的一定
  • java的各类型数据在内存中分配情况详解

    有这样一种说法 如今争锋于IT战场的两大势力 MS一族偏重于底层实现 Java一族偏重于系统架构 说法根据无从考证 但从两大势力各自的社区力量和图书市场已有佳作不难看出 此说法不虚 但掌握Java的底层实现对Java程序员来说是至关重要的
  • 用堆实现优先级队列(Priority Queue)

    1 优先级队列定义 优先级队列 priority queue 是0个或多个元素的集合 每个元素都有一个优先权 对优先级队列执行的操作有 1 查找 2 插入一个新元素 3 删除 一般情况下 查找操作用来搜索优先权最大的元素 删除操作用来删除该
  • Python中heapq模块浅析

    Python提供了heapq模块 有利于我们更好的对堆的相关操作进行简化 下面总结我所用到的相关方法 文章目录 0 回顾堆的概念 1 heappush heap item 建立大 小根堆 2 heapify heap 建立大 小根堆 3 h
  • Bracket Coloring

    Bracket Coloring 题意 给出一个括号序列 定义漂亮序列为匹配括号序列或者反转之后是匹配括号序列的序列 现在要求染色 使得相同颜色的括号组成漂亮序列 问最少需要多少种颜色即每个括号染的颜色 思路 这里可以用栈来匹配括号序列 因
  • 璀璨光滑【牛客】【题意解析+BFS+贪心】

    题目链接 中文题意 表面平静 实则暗藏玄机 而打开本题的突破口 也确确实实就在于题目的描述 也就是说 这张图的边的数目是确定的 并且这是一张连通图 而且图上的个点每个点连接出去的边的数目都是条 因为每个数都刚好只与个数在二进制位上差1 那么
  • 优先队列(堆)

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

    给定一个长度为 N 的整数数列 A1 A2 AN 你要重复以下操作 K 次 每次选择数列中最小的整数 如果最小值不止一个 选择最靠前的 将其删除 并把与它相邻的整数加上被删除的数值 输出 K 次操作后的序列 输入格式 第一行包含两个整数 N
  • JVM运行原理及Stack和Heap的实现过程

    Java语言写的源程序通过Java编译器 编译成与平台无关的 字节码程序 class文件 也就是0 1二进制程序 然后在OS之上的Java解释器中解释执行 而JVM是java的核心和基础 在java编译器和os平台之间的虚拟处理器 注 本网
  • 算法:优先队列-理论

    目录 优先队列 我们平时比较常见的优先队列的场景有什么 优先队列的实现机制 java的优先队列是怎么实现的 优先队列 我们先回忆一下什么是队列 队列 一种先进先出的数据结构 主要关注点在于先入的元素
  • 洛谷P1182-数列分段(详解)

    题目 给定一个长度为n的数列A 要求将它分为m段 要求每段连续 且每段和的最大值最小 N lt 10e5 m lt n Ai之和不超过10e9 这题一看就知道我不会 所以很老实的去看了看题解 题解也真是避重就轻 重要的地方就说 这个要自己思
  • 高级快速读入

    namespace fastIO define BUF SIZE 100000 fread gt read bool IOerror 0 inline char nc static char buf BUF SIZE p1 buf BUF
  • HDU--1050:Moving Tables (贪心)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1050 2 解题思路 将每个输入的起始房间和结束房间转换为房间前面的区间 按区间起始位置从小到大排序 首先取第一个区间 后续如果有区间的起始位
  • 蓝桥杯 - 负载均衡

    输入样例 2 6 5 5 1 1 5 3 2 2 2 6 3 1 2 3 4 1 6 1 5 1 3 3 6 1 3 4 输出样例 2 1 1 1 1 0 解析 优先队列 排序规则为任务结束的时间 在新任务的时候 弹出已经结束的任务 并且恢
  • BZOJ3425 Poi2013 Polarization

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

    题目1 扑克牌 时间限制 2000ms 单点时限 1000ms 内存限制 256MB 描述 一副不含王的扑克牌由52张牌组成 由红桃 黑桃 梅花 方块4组牌组成 每组13张不同的面值 现在给定52张牌中的若干张 请计算将它们排成一列 相邻的

随机推荐