【贪心】小Y的炮[cannon]题解
模拟赛的题目,做的时候由于第二题表打太久了,只剩下40分钟,想都没想就写了一个爆搜20分...
这道题单调性很关键,下面会解释
P.S.解释在代码里
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
inline int read(){
int ans=0,f=1;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
return ans*f;
}
inline void kai(){
freopen("cannon.in","r",stdin);
freopen("cannon.out","w",stdout);
}
const int maxn=250004;
struct data{
ll a,d;
bool operator <(const data &b)const{
return (a<b.a || (a==b.a && d<b.d));
}
}cnn[maxn],p[maxn];
ll k,h[maxn],ans=0;
int n,m,cnt=0;
map<ll,ll>f;
int main(){
n=read();m=read();k=read();
for(int i=n;i>=1;--i)h[i]=read();
for(int i=1;i<=m;++i)cnn[i].a=read(),cnn[i].d=read();
sort(cnn+1,cnn+1+m);
for(int i=1;i<=m;++i){
while(cnt && p[cnt].d<=cnn[i].d)--cnt;
p[++cnt]=cnn[i];
}//贪心删掉没有用的炮
/*
这里的贪心:如果一个炮打的低,能删掉的山的高度又小,那要它何用呢?
*/
ll dn=0;f[0]=0;
for(int i=1;i<=cnt;++i){
if(i!=1)dn=p[i-1].a;
ll l=max(dn,p[i].a-p[i].d);
for(ll j=l+1;j<=p[i].a;++j){
ll t=(j-dn-1)/p[i].d+1;
f[j]=f[max(0*1ll,j-(p[i].d*t))]+t;
}
}//处理出高度为x的山最少要删几次才行(类似于背包的做法?)
int j=1;
dn=0;
for(int i=1;i<=n;++i){
while(j<=cnt && p[j].a<h[i])++j;//第i座山用第j个炮,由于递增,可以一直下去
if(j>cnt)break;//如果当前山都处理不好,那么后面的山更不行 ,直接结束
if(j!=1)dn=p[j-1].a;
ll t=(h[i]-dn-1)/p[j].d+1;//因为单调性,可以直接用上一座山残留数据
ll q=f[max(0*1ll,h[i]-(p[j].d*t))]+t;//还是类似于背包
if(k>=q)k-=q,++ans;else break;//如果当前山加不进去,还是不行,结束
}
printf("%lld ",ans);
printf("%lld",k);
}
【贪心】小Y的炮[cannon]题解的更多相关文章
- 小Y的棋盘问题 题解
有一个n*m的棋盘,上面有一些棋子,每行每列最多只会有一个棋子,不会有两个棋子八连通.问随机一个空格子作为起点,再随机地选择一个空格子作为终点,求问不经过任意棋子最短路的期望长度是多少.多组,n,m& ...
- 小Y的炮
[存代码] #include<bits/stdc++.h> #define N 1000001 #define MAXN 100001 using namespace std; int n ...
- 【luoguP4006 清华集训2017】小Y和二叉树
题目描述 小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型. 小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下 ...
- 【洛谷4005】小Y和地铁(搜索)
[洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...
- P4005 小 Y 和地铁
题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...
- BZOJ 1193 [HNOI2006]马步距离:大范围贪心 小范围暴搜
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1193 题意: 给定起点(px,py).终点(sx,sy).(x,y < 100000 ...
- B - 小Y上学记——小Y的玩偶
B - 小Y上学记——小Y的玩偶 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- 【luogu P4007 清华集训2017】小Y和恐怖奴隶主
题目背景 “A fight? Count me in!” 要打架了,算我一个. “Everyone, get in here!” 所有人,都过来! 题目描述 小 Y 是一个喜欢玩游戏的 OIer.一天 ...
- 【luogu P4005 清华集训2017】小Y和地铁
题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...
随机推荐
- C语言中的DEBUG
#cat aa.c #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include < ...
- P4047 [JSOI2010]部落划分(最小生成树)
题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪 ...
- namespace的作用及用法
namespace 所谓namespace,是指标识符的可见范围.C++标准库中的所有标识符都被定义在一个名为 std 的namespace 中. 一.<iostream>和<ios ...
- vue 微信授权解决方案
背景 前后端分离项目 - SpringSocial 绑定与解绑社交账号如微信.QQ2018-08-14更新时隔四个月第一次更新,因为项目重构有一次接触到了微信授权,思路已经比原来清晰的多了,将重新修改 ...
- 腾讯云&硬盘信息
fly@UBT-sCloud:~/pub_work/05-ARM/00-s5pv210$ sudo fdisk -lDisk /dev/ram0: 64 MiB, 67108864 bytes, 13 ...
- 在 ServiceModel 客户端配置部分中,找不到引用协定“XXX”的默认终结点元素
一.问题 在调用远程web services接口时出现了以下问题: 二.可能的原因和解决方法 网站根目录里的web.config文件缺少了相应的配置信息 <?xml version=" ...
- hadoop手工移块
1.关于磁盘使用策略,介绍参考http://www.it165.net/admin/html/201410/3860.html 在hadoop2.0中,datanode数据副本存放磁盘选择策略有两种方 ...
- map put
public class test { static Map<String, Map<String, Integer>> mapB = new HashMap<Strin ...
- [bzoj3207]花神的嘲讽计划Ⅰ[可持久化线段树,hash]
将每k个数字求一个哈希值,存入可持久化线段树,直接查询即可 #include <iostream> #include <algorithm> #include <cstd ...
- [bzoj3529][Sdoi2014]数表_树状数组_莫比乌斯反演
数表 bzoj-3529 Sdoi-2014 题目大意:n*m的数表,第i行第j列的数是同时整除i和j的所有自然数之和.给定a,求数表中所有不超过a的和. 注释:$1\le n,m \le 10^5$ ...