正解:dp+bfs

解题报告:

传送门!

这题看起来很复杂的样子其实真的很复杂

但是仔细看一下题目,会发现其实操作只有两个目的嘛,一个是保证自己不死,一个是让对手减血

而且保证自己不死只有一种操作

而且这种操作和其他东西都麻油关系,不管多少血量,不管你前面的操作是哪些,反正加的血量是一样的

所以考虑把这两个分开来思考

首先求血量

考虑到要留尽量多的时间让对手减血,而对于攻击对手这个事儿来说,无论哪天攻击造成的伤害都是相等的,对于具体日期麻油要求,看到这样子就要想到dp了嘛(具体日期无影响鸭QAQ

所以设状态f[i][j]:第i天血量为j,最多不用刷题(也就是涨血)几天

转移很简单嘛,普通背包

然后取dp中的max,也就是最多能用来攻击对手的时间D

接下来考虑攻击对手

首先肯定是要么345组合拳要么1,相当于只有两种

设用345的两次方案分别是(d1,h1)(d2,h2),表示积累d天伤害为h

再设对手的血量为HP

然后如果要战胜对手,首先不能血量为负,所以h1+h2<=HP

又要活下去,所以HP-h1-h2<=D-d1-d2

然后上面是攻击两次嘛,如果攻击一次相当于有一组=(0,0)就好,不攻击就是两组都=(0,0)就好

然后就做完了

然后说下具体做法

首先就枚举状态昂,bfs枚举出所有可能的状态,然后把这些状态按h为第一关键字d为第二关键字地排序

然后对h从大到小地枚举第一次攻击

第二次攻击,可以先对上面的式子移项,得D>=HP-h1-h2+d1+d2

又h1d1其实是已知式,所以就是D>=T+d2-h2

如果有合法方案就说明对手会死嘛,所以要努力让它合法,就是说要努力保证d2-h2合法

但还有一个要求昂,就h1+h2<=HP

所以就在满足h1+h2<=HP的条件下,增大h2(即指针向后扫),每次取(-h2+d2)min,然后比较,O(状态数)扫过去就好

然后另外有个小细节就是这里有个手写hash

但是很简单,简单的hash思想+链式前向星思想就好,不想多说,自己看代码就好QAQ

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define gc getchar()
#define mp make_pair
#define fr first
#define sc second
#define int long long
#define rp(i,x,y) for(rg int i=x;i<=y;++i)
#define my(i,x,y) for(rg int i=x;i>=y;--i)
#define e(i,x) for(rg int i=head[x];i;i=edge[i].nxt) const int N=+,M=+,mod=;
int n,m,mc,a[N],w[N],c[N],f[N][N],dmx,mxc,zt_cnt;
pair<int,int>zt[M];
struct node{int f,l,d;};
struct hsh
{
struct ed{int x,y,nxt;}edge[M];
int head[mod+],cnt;
void push(int x,int y){int pos=(1ll*x*+y)%mod;edge[++cnt]=(ed){x,y,head[pos]};head[pos]=cnt;}
bool query(int x,int y){int pos=(1ll*x*+y)%mod;e(i,pos)if(edge[i].x==x&&edge[i].y==y)return true;return false;}
}mapp; il int read()
{
char ch=gc;int x=;bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void dp()
{
rp(i,,n)
rp(j,a[i],mc)
{
f[i][j-a[i]]=max(f[i-][j]+,f[i][j-a[i]]);
f[i][min(j-a[i]+w[i],mc)]=max(f[i-][j],f[i][min(j-a[i]+w[i],mc)]);
}
rp(i,,n)rp(j,,mc)dmx=max(dmx,f[i][j]);
}
il void bfs()
{
queue<node>Q;Q.push((node){,,});
while(!Q.empty())
{
node tmp=Q.front();Q.pop();
if(tmp.d==dmx)continue;
Q.push((node){tmp.f,tmp.l+,tmp.d+});
if(tmp.l> && 1ll*tmp.f*tmp.l<=mxc && !mapp.query(tmp.f*tmp.l,tmp.d+))
{
Q.push((node){1ll*tmp.f*tmp.l,tmp.l,tmp.d+});
zt[++zt_cnt]=mp(1ll*tmp.f*tmp.l,tmp.d+);
mapp.push(tmp.f*tmp.l,tmp.d+);
}
}
}
il void wk(int hp)
{
if(hp<=dmx)return void(printf("1\n"));
int mn=1e9;int k=;
my(j,zt_cnt,)
{
while(k<zt_cnt && zt[k].fr+zt[j].fr<=hp)mn=min(mn,zt[k].sc-zt[k].fr),++k;
if(mn+hp-zt[j].fr+zt[j].sc<=dmx)return void(printf("1\n"));
if(zt[j].fr<=hp && hp-zt[j].fr<=dmx-zt[j].sc)return void(printf("1\n"));
}
printf("0\n");
} main()
{
// freopen("dl.in","r",stdin);freopen("dl.out","w",stdout);
n=read();m=read();mc=read();rp(i,,n)a[i]=read();rp(i,,n)w[i]=read();rp(i,,m)mxc=max(mxc,c[i]=read());
dp();bfs();sort(zt+,zt++zt_cnt);rp(i,,m)wk(c[i]);
return ;
}

这儿是代码QAQ

洛谷P3724 大佬 [AH2017/HNOI2017] dp+bfs的更多相关文章

  1. 洛谷P3722 影魔 [AH2017/HNOI2017] 线段树+扫描线

    正解:线段树+扫描线 解题报告: 传送门! 先理解一下这道题,大概是这样儿的: 对于一个点对,如果他们的两端是这段区间的最大值和次大值,那么他们会有p1的贡献 如果他们的两端是最大值和一个非次大值,那 ...

  2. 题解 洛谷 P3726 【[AH2017/HNOI2017]抛硬币】

    可以分别枚举两人正面朝上的次数来统计答案,所求即为 \[\sum_{i=0}^{a}\sum_{j=0}^{b} \binom{a}{i} \binom{b}{j} [i>j] \] 将\(i\ ...

  3. 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)

    洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\)​​​​​.我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ...

  4. Lightning Conductor 洛谷P3515 决策单调性优化DP

    遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...

  5. 【洛谷】P1052 过河【DP+路径压缩】

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙 ...

  6. 洛谷2344 奶牛抗议(DP+BIT+离散化)

    洛谷2344 奶牛抗议 本题地址:http://www.luogu.org/problem/show?pid=2344 题目背景 Generic Cow Protests, 2011 Feb 题目描述 ...

  7. 洛谷P1541 乌龟棋(四维DP)

    To 洛谷.1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游 ...

  8. 【题解】洛谷P1052 [NOIP2005TG] 过河(DP+离散化)

    题目来源:洛谷P1052 思路 一开始觉得是贪心 但是仔细一想不对 是DP 再仔细一看数据不对 有点大 如果直接存下的话 显然会炸 那么就需要考虑离散化 因为一步最大跳10格 那么我们考虑从1到10都 ...

  9. 洛谷1736(二维dp+预处理)

    洛谷1387的进阶版,但很像. 1387要求是“全为1的正方形”,取dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))吧?这个有“只有对 ...

随机推荐

  1. 聊聊Python中的闭包和装饰器

    1. 闭包 首先我们明确一下函数的引用,如下所示: def test1(): print("--- in test1 func----") # 调用函数 test1() # 引用函 ...

  2. one-to-all及all-to-all网络通信模式

    在这两种模式下,因为 占用的通信通道非常高,形成了一个一对多的通道 甚至是多对多的通道,导致现有的fattree网络结构负载太大.

  3. highCharts图表入门简介

    一.Highcharts简介 Highcharts:功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯js图表库 Highcharts是一款纯javascript编写的图表库,能够很简单便捷的在W ...

  4. Tomcat容器做到自我保护,设置最大连接数(服务限流:tomcat请求数限制)

    http://itindex.net/detail/58707-%E5%81%87%E6%AD%BB-tomcat-%E5%AE%B9%E5%99%A8 为了确保服务不会被过多的http长连接压垮,我 ...

  5. vue返回上一页面如果没有上一页面返回首页

    methods: { back(){ if (window.history.length <= 1) { this.$router.push({path:'/'}) return false } ...

  6. lua系列之 lua-cjson模块安装报错问题解决

    lua-cjson下载 下载地址 报错信息 [root@LeoDevops lua-cjson]# make cc -c -O3 -Wall -pedantic -DNDEBUG -I/usr/loc ...

  7. GoLang之strings、buffers、bytes、binary包

    strings包 strings包的使用举例: package main import s "strings" import "fmt" var p = fmt ...

  8. [Model] AlexNet

    CaffeNet - a variant of AlexNet Ref: Classification: Instant Recognition with Caffe This is caffeNet ...

  9. [PHP] 07 - Json, XML and MySQL

    前言 [Node.js] 09 - Connect with Database 菜鸟JSON教程[内容不多] PHPSimpleXML[大概了解下即可] SQL语句需要复习一遍:http://www. ...

  10. 8 -- 深入使用Spring -- 6... Spring的事务

    8.6 Spring 的事务 8.6.1 Spring支持的事务策略 8.6.2 使用XML Schema配置事务策略 8.6.3 使用@Transactional 参考1. 啦啦啦 我早就肯定我的身 ...