度度熊与邪恶大魔王

思路:由于防御和血量的范围很小,所以暴力枚举出对于每种防御造成的每种伤害所需的最小花费,最后只需在伤害大于等于血量的情况下再找到最小花费(这个只需要后缀最小值预处理一下就可以了)

状态:dp[i][j]表示对防御为i的怪兽造成伤害为j的所需最小晶石花费。

状态转移方程:dp[i][j]=min(dp[i][j],dp[i][j-t])(t表示每种技能造成的伤害,t=p-i,t>0)

代码1:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls rt<<1,l,m
#define rs rt<<1|1,m+1,r
#define pb push_back
#define mem(a,b) memset((a),(b),sizeof(a))
const int INF=0x3f3f3f3f;
const int N=2e3+;//必须开2e3,因为造成的伤害是大于等于血量的(1000+1000)
const int M=1e5+;
int dp[][N];
int a[M],b[M],k[N],p[N];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=;i<n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
for(int i=;i<m;i++)
{
scanf("%d%d",&k[i],&p[i]);
}
mem(dp,INF);
for(int i=;i<=;i++)
{
dp[i][]=;//所有状态的初始状态都是dp[i][0]
for(int j=;j<m;j++)
{
int t=p[j]-i;
if(t<=)continue;
for(int l=t;l<N;l++)
{
dp[i][l]=min(dp[i][l-t]+k[j],dp[i][l]);
}
}
for(int j=N-;j>=;j--)
{
dp[i][j]=min(dp[i][j+],dp[i][j]);//求一下后缀最小值
}
}
ll ans=;
bool flag=false;
for(int i=;i<n;i++)
{
ans+=dp[b[i]][a[i]];
if(dp[b[i]][a[i]]==INF)flag=true;//等于INF表示不存在这样的最小花费
}
if(flag)cout<<-<<endl;
else cout<<ans<<endl;
}
return ;
}

 代码2:

上面那个代码是先枚举技能再枚举伤害的,这个代码是先枚举伤害再枚举技能的,相比而言这个要慢一些,因为上面那个枚举技能时就知道伤害的范围(下界即t),相当于下面这个代码剪过枝了。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls rt<<1,l,m
#define rs rt<<1|1,m+1,r
#define pb push_back
#define mem(a,b) memset((a),(b),sizeof(a))
const int INF=0x3f3f3f3f;
const int N=2e3+;
const int M=1e5+;
int dp[][N];
int a[M],b[M],k[N],p[N];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=;i<n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
for(int i=;i<m;i++)
{
scanf("%d%d",&k[i],&p[i]);
}
mem(dp,INF);
for(int i=;i<=;i++)
{
dp[i][]=;
for(int j=;j<N;j++)
{
for(int l=;l<m;l++)
{
int t=p[l]-i;
if(t<=||t>j)continue;
dp[i][j]=min(dp[i][j-t]+k[l],dp[i][j]);
}
}
for(int j=N-;j>=;j--)
{
dp[i][j]=min(dp[i][j+],dp[i][j]);
}
}
ll ans=;
bool flag=false;
for(int i=;i<n;i++)
{
ans+=dp[b[i]][a[i]];
if(dp[b[i]][a[i]]==INF)flag=true;
}
if(flag)cout<<-<<endl;
else cout<<ans<<endl;
}
return ;
}

2017"百度之星"程序设计大赛 - 资格赛-度度熊与邪恶大魔王(dp+后缀最小值)的更多相关文章

  1. 2017"百度之星"程序设计大赛 - 资格赛 度度熊的王国战略

    度度熊的王国战略 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更好的进攻哗啦啦族,度度 ...

  2. hdu 6082 度度熊与邪恶大魔王(2017"百度之星"程序设计大赛 - 资格赛 )

    度度熊与邪恶大魔王 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. [SinGuLaRiTy] 2017 百度之星程序设计大赛-资格赛

    [SinGuLaRiTy-1034] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 度度熊保护村庄  Time Limit: 2000/10 ...

  4. 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  5. 2017"百度之星"程序设计大赛 - 资格赛

    度度熊与邪恶大魔王  Accepts: 3666  Submissions: 22474  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: ...

  6. 2017"百度之星"程序设计大赛 - 资格赛 1002 度度熊的王国战略

    全局最小割 Stoer-Wagner (SW算法)优化 优化吃藕了,感谢放宽时限,感谢平板电视 (pb_ds) #include <iostream> #include <cstdi ...

  7. 2017"百度之星"程序设计大赛 - 资格赛 寻找母串

    Problem Description 对于一个串S,当它同时满足如下条件时,它就是一个01偏串: 1.只由0和1两种符组成: 2.在S的每一个前缀中,0的个数不超过1的个数: 3.S中0的个数和1的 ...

  8. HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017"百度之星"程序设计大赛 - 初赛(B))

    小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. sql 事务运用实例

    ------------------------------ create proc SaveFinancialProduct@FinancialName nvarchar(50),--产品名称@Yi ...

  2. CXF创建webservice客户端和服务端

    转 一.CXF的介绍 Apache CXF是一个开源的WebService框架,CXF大大简化了Webservice的创建,同时它继承了XFire的传统,一样可以和spring天然的进行无缝的集成.C ...

  3. mysql插入和更新时自动更新为当前时间

    创建表的时候添加 CREATE TABLE `tmp` (   `id` varchar(32) NOT NULL,  `update_time ` timestamp NOT NULL DEFAUL ...

  4. Linux中Postfix邮件安装配置(二)

    本套邮件系统的搭建,从如何发邮件到收邮件到认证到虚拟用户虚拟域以及反病毒和反垃圾邮件等都有详细的介绍.在搭建过程中必须的参数解释以及原理都有告诉,这样才能更好地理解邮件系统. 卸载自带postfix ...

  5. 我用了7年时间成长为阿里Java架构师,你呢?(附学习路线图)

      前言:我用了七年的时间,一步一步走到了现在,中途也有了解过其他的技术,也想过要转其他的语言,但是最后还是坚持下来走Java这条路,希望我的经历可以帮助到后来的人,要是觉得对你有帮助的话,可以点赞关 ...

  6. python-kafka之理论篇

    kafka系列文章之python-api的使用. 在使用kafka-python时候需要注意,一定要版本兼容,否则在使用生产者会报 无法更新元数据的错误. 在本片测试中java版本为如下,kafka版 ...

  7. [省选模拟]array

    这题真是太神了! 考试的时候冲着四十分写了个$O(\frac{N^3logN}{32})$的制杖算法. 然后就狠狠的T掉了.如果没有充分的理解单调性和应用单调性就只有10分的傻逼分拿了. 首先考虑枚举 ...

  8. 20145301 赵嘉鑫 《网络对抗》Exp5 MSF基础应用

    20145301 赵嘉鑫 <网络对抗>Exp5 MSF基础应用 一 实验链接 渗透实验一:MS08_067渗透实验 渗透实验二:MS14_064渗透实验  (首用) 渗透实验三:Adobe ...

  9. VC++实现程序重启的方法(转载)

    转载:http://blog.csdn.net/clever101/article/details/9327597 很多时候系统有很多配置项,修改了配置项之后能有一个按钮实现系统重启.所谓重启就是杀死 ...

  10. 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 4 章 答案

    判断对错 1.利用 grAphiCs.py 可以在 Python 的 shell 窗口中绘制图形.2.传统上,图形窗口的左上角坐标为(0,0).3.图形屏幕上的单个点称为像素.4.创建类的新实例的函数 ...