LUOGU P1779 魔鬼杀手_NOI导刊2010提高(03)
解题思路
背包,首先先用aoe都打残然后单伤补刀,用f[i]表示AOE打了i的伤害的最小花费,g[i]表示单伤打了i的伤害的最小花费。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int MAXN = 105;
inline int rd(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
    while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return f?x:-x;
}
int f[100005],g[100005],ans=0x3f3f3f3f;
int n,m,val[MAXN],cost[MAXN],hp[MAXN];
bool al[MAXN];
signed main(){
    n=rd();memset(f,0x3f,sizeof(f));
    memset(g,0x3f,sizeof(g));
    for(register int i=1;i<=n;i++) hp[i]=rd();
    m=rd();char c[MAXN],s[MAXN];
    for(register int i=1;i<=m;i++){
        scanf("%s",c+1);cost[i]=rd();
        scanf("%s",s+1);if(s[1]=='A') al[i]=1;
        val[i]=rd();
        if(cost[i]==0 && val[i]>0) {cout<<0<<endl;return 0;}
        if(val[i]>100000) val[i]=100000;
    }f[0]=0;g[0]=0;
    for(register int i=1;i<=m;i++){
        if(al[i]){
            for(register int j=val[i];j<=100000;j++)
                f[j]=min(f[j],f[j-val[i]]+cost[i]);
        }
        else {
            for(register int j=val[i];j<=100000;j++)
                g[j]=min(g[j],g[j-val[i]]+cost[i]);
        }
    }
    for(register int i=99999;i>=0;i--)
        if(g[i]>g[i+1]) g[i]=g[i+1];  //打了i+1的伤害就一定打了i的伤害
    for(register int i=0;i<=100000;i++) {
        int now=f[i];if(now>ans) continue;
        for(register int j=1;j<=n;j++){
            if(hp[j]>i) now+=g[hp[j]-i];
            if(now>ans) break;
        }
        ans=min(ans,now);
    }cout<<ans<<endl;
}LUOGU P1779 魔鬼杀手_NOI导刊2010提高(03)的更多相关文章
- Luogu P1776 宝物筛选_NOI导刊2010提高(02)(多重背包模版)
		传送门 多重背包板子题, 多重背包就是每种东西有好几个,可以把它拆分成一个一个的01背包 优化:二进制拆分(拆成1+2+4+8+16+...) 比如18=1+2+4+8+3,可以证明18以内的任何数都 ... 
- luogu P1776 宝物筛选_NOI导刊2010提高(02)
		Sto flashhu orz flash太强啦 多重背包裸题(逃 使用压维大法,\(f_i\)为总重量为\(i\)时的答案 对于每种物品,记\(w\)为单个的重量,\(v\)为单个的价值,\(m\) ... 
- luogu P1801 【黑匣子_NOI导刊2010提高(06)】
		这里提供一个简单实现新思路: . 约定: 以下n指代的数的数量,不是题目所指的n 以下m指代询问的数量,不是题目所指的m (不好意思,这是本人习惯) 分块+堆 **堆一次只能输出堆顶的一个元素,如果我 ... 
- Luogu P1801 黑匣子_NOI导刊2010提高(06)
		P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ... 
- P1799 数列_NOI导刊2010提高(06)
		P1799 数列_NOI导刊2010提高(06)f[i][j]表示前i个数删去j个数得到的最大价值.if(i-j==x) f[i][j]=max(f[i][j],f[i-1][j]+1); else ... 
- P1771 方程的解_NOI导刊2010提高(01)
		P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ... 
- 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)
		[题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ... 
- 洛谷  P1777 帮助_NOI导刊2010提高(03) 解题报告
		P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ... 
- P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化
		多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ... 
随机推荐
- Leetcode187. Repeated DNA Sequences重复的DNA序列
			所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:"ACGAATTCCG".在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助. 编写一个函数 ... 
- [JZOJ3293] 【SHTSC2013】阶乘字符串
			题目 题目大意 给你一个字符串,判断这个字符串是否为"阶乘字符串". 就是子序列包含字符集的全排列的字符串. n≤26n\leq 26n≤26 ∣S∣≤450|S|\leq 450 ... 
- pyQT Dialog默认选中某一个选项问题的解决
			方法一: 在新建ui文件时不要新建Dialog # -*- coding: utf-8 -*- # Form implementation generated from reading ui file ... 
- Android 之 BroadcaseReceiver
			1.在AndroidManifest.xml中注册 <receiver android:name=".MyReceiver"> <intent-filter &g ... 
- 如何在window和mac下查找数据库
			1. mac 下终端使用步骤 cd /Applications/xampp/bin ./mysql -u root 2. window CMD命令中执行步骤 D: cd D:/xampp/mysql ... 
- 使用RequestsCookieJar自动保存并传递cookie
			使用python的requests开发爬虫程序的时候,经常需要将之前请求返回的cookie值作为下一个请求的cookie进行调用,比如模拟登录之后的返回的sessionID,就是需要作为后续请求的co ... 
- VS2017装了西红柿插件之后,启动很多次才能启动成功,进程有很多devenv.exe但是就是无法启动成功
			VS2017装了西红柿插件之后,启动很多次才能启动成功,进程有很多devenv.exe但是就是无法启动成功,这个可能是西红柿插件visual assist的问题 启动vs命令行 输入: devenv ... 
- Spring Http Basic(基本)和Digest(摘要)验证
			Basic(基本)和Digest(摘要)验证都是web应用中很受欢迎的可选机制. Basic验证一般用来处理无状态的客户端,它们在每次请求都附带它们的证书. 很常见的用法是把它和基于表单的验证一起使用 ... 
- 二分判定 覆盖问题 BZOJ 1052
			//二分判定 覆盖问题 BZOJ 1052 // 首先确定一个最小矩阵包围所有点,则最优正方形的一个角一定与矩形一个角重合. // 然后枚举每个角,再解决子问题 #include <bits/s ... 
- 【核心核心】5.Spring【DI】注解方式
			使用注解的方式依赖注入不用提供set方法 1.普通类型的注解 @Value @Value(value="春天") private String name; 2.对象类型的注解 @A ... 
