题意:

有\(n\)个怪物,每个怪物有攻击力\(a_i\)点;有\(m\)个英雄,每个英雄有攻击力\(p_i\)点,耐力\(s_{i}\)点。

怪物需要被依次杀死(按输入顺序)。

每一天可以挑选一个英雄去杀怪物,他可以杀死的怪物攻击力小于等于他本身(即\(a\leq p\)),每天最多可以杀死\(s\)个怪物。(每个英雄可以使用任意次)

问最少需要多少天可以杀死所有怪物(不能则输出\(-1\))。

分析:

\((1)\)我们找到怪物的最大攻击力和英雄的最大攻击力,判断是否要输出\(-1\)。

\((2)\)将英雄按攻击力\(p\)值排序,我们可以发现对于英雄\(b[i]\)而言,如果对于\(i<j\leq m\),且有\(b[i].s<b[j].s\),我们可以选择英雄\(j\),而不是英雄\(i\),那么我们可以把\(b[i].s\)替换为\(b[j].s\)(意思为选择英雄\(i\)时选择英雄\(j\))。

\((3)\)因此我们进行后缀操作将\(b[i].s\)改为英雄\(i\)~\(n\)中最大的耐力值,以便进行下一步。

\((4)\)对于某个怪物而言,我们可以找到一个英雄,他的攻击力刚好大于等于该怪物(二分)。我们上一步将该英雄的耐力改为了后缀最大值,那么我们便选择这个英雄。

\((5)\)我们从第一天开始,枚举每一个怪物,找到当前天我们可以杀死最多怪物的英雄,如果对于某个怪物而言,杀死他的人的耐力(我们进行了后缀操作)不足以支撑该天,我们将该怪物放到下一天,并重复操作,直至杀死所有怪物。因此我们需要保存的量有:当前的天数\(k\),昨天杀死的最后一只怪物的编号\(last\),今天所能杀死的最多怪物数(表现为所需要的最小耐力)\(minn\)。

#pragma GCC optimize(3, "Ofast", "inline")

#include <bits/stdc++.h>

#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define LL long long
using namespace std;
const int maxn = (ll) 2e5 + 5;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f; struct node {
int p, s; bool operator<(const node &b) {//用做排序
return p < b.p;
}
} b[maxn]; bool cmp(const node &x, int y) {//用做二分
return x.p < y;
} int a[maxn]; int main() {
start;
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
int maxa = 0, maxs = 0;//用做判-1
for (int i = 1; i <= n; ++i) {
cin >> a[i];
maxa = max(maxa, a[i]);
}
int m;
cin >> m;
for (int i = 1; i <= m; ++i) {
cin >> b[i].p >> b[i].s;
maxs = max(maxs, b[i].p);
}
if (maxa > maxs) {
cout << -1 << '\n';
continue;
}
sort(b + 1, b + m + 1);
for (int i = m - 1; i >= 1; --i)//后缀操作
b[i].s = max(b[i].s, b[i + 1].s);
int k = 1;
int last = 0;
int minn = inf;
for (int i = 1; i <= n; ++i) {
int t = lower_bound(b + 1, b + m + 1, a[i], cmp) - b;//刚好能杀死该怪物的英雄编号
minn = min(b[t].s, minn);//今天所需要的最小耐力
if (minn + last < i) {//将这只怪物放到明天杀
minn = b[t].s;
++k;
last = i - 1;
}
}
cout << k << '\n';
}
return 0;
}

本场比赛\(D\)和\(E\)惨痛教训:玩后缀一定要注意边界!!!

Codeforces 1257D - Yet Another Monster Killing Problem的更多相关文章

  1. Educational Codeforces Round 76 (Rated for Div. 2) D. Yet Another Monster Killing Problem 贪心

    D. Yet Another Monster Killing Problem You play a computer game. In this game, you lead a party of

  2. Educational Codeforces Round 76 (Rated for Div. 2) D. Yet Another Monster Killing Problem

    You play a computer game. In this game, you lead a party of mm heroes, and you have to clear a dunge ...

  3. D - Yet Another Monster Killing Problem

    题目连接: https://codeforces.com/contest/1257/problem/D 题目大意: n个怪兽,m个英雄,每个怪兽有一定的能力值,每个英雄有一定的能力值和一定的耐力值.耐 ...

  4. 【CF1257D】Yet Another Monster Killing Problem【贪心】

    题意:给定一些怪物,每天可以选一个勇士进去打怪,每个勇士每天只能打不超过si个怪物,每个勇士只能打能力值≤pi的怪物,问最少多少天打完所有怪物 题解:贪心,每天尽可能多的去打怪,那么存一个对于长度为i ...

  5. Educational Codeforces Round 40 F. Runner's Problem

    Educational Codeforces Round 40 F. Runner's Problem 题意: 给一个$ 3 * m \(的矩阵,问从\)(2,1)$ 出发 走到 \((2,m)\) ...

  6. Codeforces Beta Round #17 A - Noldbach problem 暴力

    A - Noldbach problem 题面链接 http://codeforces.com/contest/17/problem/A 题面 Nick is interested in prime ...

  7. codeforces D. Pashmak and Parmida's problem

    http://codeforces.com/contest/459/problem/D 题意:给你n个数,然后统计多少组(i,j)使得f(1,i,ai)>f(j,n,aj); 思路:先从左往右统 ...

  8. CodeForces 459D Pashmak and Parmida's problem

    Pashmak and Parmida's problem Time Limit:3000MS     Memory Limit:262144KB     64bit IO Format:%I64d ...

  9. Codeforces Beta Round #2 C. Commentator problem 模拟退火

    C. Commentator problem 题目连接: http://www.codeforces.com/contest/2/problem/C Description The Olympic G ...

  10. Codeforces 954I Yet Another String Matching Problem(并查集 + FFT)

    题目链接  Educational Codeforces Round 40  Problem I 题意  定义两个长度相等的字符串之间的距离为:   把两个字符串中所有同一种字符变成另外一种,使得两个 ...

随机推荐

  1. pytest在conftest里添加钩子函数进行失败处截图,并绑定到allure报告里

    在conftest里要先定义一个selenium之类的driver. @pytest.hookimpl(tryfirst=True, hookwrapper=True)def pytest_runte ...

  2. Request类源码分析、序列化组件介绍、序列化类的基本使用、常用字段类和参数、反序列化之校验、反序列化之保存、APIVIew+序列化类+Response写的五个接口代码、序列化高级用法之source、序列化高级用法之定制字段的两种方式、多表关联反序列化保存、反序列化字段校验其他、ModelSerializer使用

    目录 一.Request类源码分析 二.序列化组件介绍 三.序列化类的基本使用 查询所有和查询单条 四.常用字段类和参数(了解) 常用字段类 字段参数(校验数据来用的) 五.反序列化之校验 六.反序列 ...

  3. day09-SpringCloud Sleuth+Zipkin-链路追踪

    SpringCloud Sleuth+Zipkin-链路追踪 官网:spring-cloud/spring-cloud-sleuth: Distributed tracing for spring c ...

  4. 原来kafka也有事务啊,再也不担心消息不一致了

    前言 现在假定这么一个业务场景,从kafka中的topic获取消息数据,经过一定加工处理后,发送到另外一个topic中,要求整个过程消息不能丢失,也不能重复发送,即实现端到端的Exactly-Once ...

  5. V8是如何执行JavaScript代码的?

    前言 一般来讲,电脑是不能直接运行我们的javascript代码的,它需要一个翻译程序将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言.目前市面上有很多种 JavaScri ...

  6. TheRoleofSpatialPyramidalPoolinginConvolutionalNeuralNe

    目录 1. 引言 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 2.3. 相关技术比较 3. 实现步骤与流程 3.1. 准备工作:环境配置与依赖安装 3.2. 核心模块实现 3 ...

  7. kafka学习笔记02

    kafka拥有与其他几个消息队列同样的本事:   ①缓冲/削峰:控制和优化数据经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况.   应用场景:双十一秒杀活动,将用户消息写入消息队列中,我 ...

  8. List 接口及其常用方法

    List 接口基本介绍 List接口是Collection接口的子接口,其主要特点如下: List中元素有序,是按照元素的插入顺序进行排序的.每个元素都有一个与之关联的整数型索引(索引从 0 开始), ...

  9. 一个跨平台的`ChatGPT`悬浮窗工具

    一个跨平台的ChatGPT悬浮窗工具 使用avalonia实现的ChatGPT的工具,设计成悬浮窗,并且支持插件. 如何实现悬浮窗? 在使用avalonia实现悬浮窗也是非常的简单的. 实现我们需要将 ...

  10. 如何将视频文件.h264和音频文件.mp3复用为输出文件output.mp4?

    一.初始化复用器 在这个部分我们可以分三步进行:(1)打开输入视频文件上下文句柄 (2)打开输入音频文件上下文句柄 (3)打开输出文件上下文句柄 1.打开输入视频文件上下文句柄 在这一步,我们主要用到 ...