/*
神仙yyb 理解题意可以发现 能够对大佬造成的伤害只和你怼了多少天大佬有关, 而且显然天数越多越好 那么我们可以先通过预处理来找出我们最多能够怼多少天大佬 然后我们发现最后我们能怼的血量状态数是不多的??, 可以直接bfs弄一下
这样的话我们处理出了所有的对(d, hp)表示可以使用d天打hp血量 然后暴力的话就是枚举第一次怼了多少天, 第二次怼了多少天, 然后可以双指针扫一下 这样复杂度是 N * 状态数的 假设我们找到的两种情况分别是 (d1, hp1), (d2, hp2) 那么需要满足等式hp1 + hp2 <= C 和 hp1 + hp2 + (D - d1 - d2) >= C才可行 我们对于所有的状态按照hp排序, 然后从大到小枚举(hpi, di), 那么我们要找到的就是hpj <= C - hpi 且 dj <= D - di 且
hpi + hpj + (D - di - dj) >= C 的点是否存在, 然后发现第二个限制没有用 那么我们就可以维护前缀的hpj - dj的最大值进行判断了 只怼一次或者一次也不怼的情况可以直接判断 我怀疑这个题目是个假题, 因为样例中间一定会死?? */
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#define ll long long
#define M 110
#define mmp make_pair
#include<set>
using namespace std;
int read()
{
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
int n, m, maxx, tot, cnt;
int f[M][M], a[M], w[M];
//int f[2][M][M], a[M], w[M];
int sum[10001000];
struct Note
{
int hp, d;
bool operator < (const Note &b) const
{
return this->hp < b.hp;
}
}note[10001000];
struct Que
{
int ko, cost, l;
};
const int inf = 100000000;
set<ll>st;
set<ll>::iterator it; bool find(ll x)
{
it = st.find(x);
if(it != st.end()) return true;
st.insert(x);
return false;
} ll ha(int hp, int d)
{
return 1ll * d * 10 * inf + hp;
} void bfs()
{
queue<Que> q;
q.push((Que) {1, 1, 0} );
while(!q.empty())
{
Que now = q.front();
q.pop();
if(now.cost < tot)
{
q.push((Que){now.ko, now.cost + 1, now.l + 1});
if(now.l > 1 && 1ll * now.ko * now.l <= inf && !find(ha(now.ko * now.l, now.cost + 1)))
{
q.push((Que){now.ko * now.l, now.cost + 1, now.l});
note[++cnt] = (Note) {now.ko * now.l, now.cost + 1};
}
}
}
}
int workpre()
{
// int now = 1, last = 0;
// f[now][maxx][0] = 1;
// for(int k = 1; k <= n; k++)
// {
// swap(now, last);
// memset(f[now], 0, sizeof(f[now]));
// for(int i = a[k]; i <= maxx; i++)
// {
// for(int j = 0; j < k; j++)
// {
// if(f[last][i][j])
// {
// f[now][i - a[k]][j + 1] = true, f[now][min(maxx, i - a[k] + w[k])][j] = true;
// }
// }
// }
// }
// for(int i = n; i >= 0; i--)
// {
// for(int j = 0; j <= maxx; j++)
// {
// if(f[now][j][i]) return i;
// }
// }
for(int i = 1; i <= n; i++) for(int j = a[i]; j <= maxx; j++) f[i][j - a[i]] = max(f[i - 1][j] + 1, f[i][j - a[i]]), f[i][min(j - a[i] + w[i], maxx)] = max(f[i - 1][j], f[i][min(j - a[i] + w[i], maxx)]);
int ans = 0;
for(int i = 1; i <= n; i++) for(int j = 1; j <= maxx; j++) ans = max(ans, f[i][j]);
return ans;
} int main()
{
n = read(), m = read(), maxx = read();
for(int i = 1; i <= n; i++) a[i] = read();
for(int i = 1; i <= n; i++) w[i] = read();
tot = workpre();
bfs();
sort(note + 1, note + cnt + 1);
sum[0] = -inf;
for(int i = 1; i <= cnt; i++) sum[i] = max(sum[i - 1], note[i].hp - note[i].d);
while(m--)
{
int c = read(), flag = 0;
if(c <= tot) flag = 1;
else
{
int lst = 1;
for(int i = cnt; i >= 1; i--)
{
while(lst <= cnt && note[i].hp + note[lst].hp <= c) lst++;
if(note[i].hp <= c && tot - note[i].d >= c - note[i].hp) flag = true;
if(sum[lst - 1] + note[i].hp - note[i].d >= c - tot) flag = true;
}
}
cout << flag << "\n";
}
return 0;
}

[AH2017/HNOI2017]大佬(动态规划 搜索)的更多相关文章

  1. [AH2017/HNOI2017]大佬

    题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...

  2. 洛谷P3724 [AH2017/HNOI2017]大佬(决策单调性)

    传送门 这个思路很妙诶->这里 以下为了方便,我把自信说成血量好了 虽然表面上看起来每一天有很多种选择,然而我们首先要保证的是不死,然后考虑不死的情况下最多能拿出多少天来进行其他操作.不死可以d ...

  3. P3724 [AH2017/HNOI2017]大佬

    传送门 发现保持自信和做其他事情互不干扰,可以直接做一次 $dp$ 求出最多能空出几天来怼大佬 然后就变成给你若干天,是否能怼死大佬,考虑求出所有的 天数和输出的嘲讽值集合,因为天数不多,嘲讽值增长很 ...

  4. #10 [AH2017/HNOI2017]大佬

    题解: 题意看上去挺复杂的 分析一下就能发现自己的自信是没啥用的 只要随便dp一下看看最多能有多少天不使用增加自信 然后问题就变成了 求C1+C2+k=C 然后发现C有10^8 显然枚举C1是不行的了 ...

  5. P3723 [AH2017/HNOI2017]礼物

    题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1      c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ...

  6. 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告

    P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...

  7. [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)

    题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...

  8. 笔记-[AH2017/HNOI2017]礼物

    笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ...

  9. BZOJ4828 AHOI/HNOI2017大佬(动态规划+bfs)

    注意到怼大佬的操作至多只能进行两次.我们逐步简化问题. 首先令f[i][j]表示第i天结束后自信值为j时至多有多少天可以进行非防御操作(即恢复自信值之外的操作).这个dp非常显然.由于最终只需要保证存 ...

随机推荐

  1. 使用 Travis 进行持续集成

    廖雪峰教程:https://www.liaoxuefeng.com/article/0014631488240837e3633d3d180476cb684ba7c10fda6f6000

  2. gitlab 可以上传代码,但是 不能 上传 tag 问题

    原因是 puttygen 生成的 公私钥不能用, 换 git 私钥后 ( 默认不能导入到 pageant  ),再用 puttygen 转一次就可以了.

  3. Scrapy 爬取BOSS直聘关于Python招聘岗位

    年前的时候想看下招聘Python的岗位有多少,当时考虑目前比较流行的招聘网站就属于boss直聘,所以使用Scrapy来爬取下boss直聘的Python岗位. 1.首先我们创建一个Scrapy 工程 s ...

  4. C语言 二维数组(指针)动态分配和释放(转)

    C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...

  5. py-day1 pycharm 的安装 以及部分设置

    配置变量    用 :分割 pycharm 的安装: https://blog.csdn.net/bfqs1988/article/details/85250950 要装就装 专业版 不要汉化 破解时 ...

  6. Jmeter学习—004—使用代理录制脚本—HTTP代理服务器(APP、web皆可)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mmmmmmm_2niu/article/details/78136253记得我最开始使用jmeter ...

  7. Github使用说明 --整理者米米

    打开百度搜索Git官网下载对应的windows版本 傻瓜式默认安装,点击完成 PS:安装的过程比较慢 安装完成后打开命令行窗口(cmd) 查看版本号------git --version   安装成功 ...

  8. MySQL体系架构

    MySQL体系架构 学习一门数据库系统首先得了解它的架构,明白它的架构原理对于后期的分析问题和性能调优都有很大的帮助,接下来就通过分析架构图来认识它. 数据库:物理操作系统文件或者其它文件的集合,在m ...

  9. 蒲公英 Bug 管理云

    官网访问地址:https://www.tracup.com/ 优势地方: ①免费使用 现在免费,今后也一直免费. ②无需部署 网站采用云端部署,这也就意味着无需开发者自己搭建.部署,注册一个蒲公英账号 ...

  10. Video Test Pattern Generator(7.0)软件调试记录

    Video Test Pattern Generator(7.0)软件调试记录 . XVidC_VideoMode XVIDC_VM_576_50_I = XVIDC_VM_720x576_50_I ...