God of War - HDU 2809(状态压缩+模拟)
题目大意:貌似是一个游戏,首先给出卢布的攻击,防御,还有血量,再给出每升一级增加的攻击防御还有血量,然后又N个敌人,杀死每个敌人都会得到一些经验,求杀死完所有敌人时剩余的最大血量。
分析:因为敌人比较少,最多只有20个,所以状态最多有2^20种,用dp[i]表示状态为i的时候的最大剩余血量,然后模拟战斗即可。
代码如下:
==========================================================================================================================
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std; const int Bit = ;
const int MaxExp = ; int dp[<<Bit];///表示剩余的最大血量 struct Enemies
{///敌人的属性
int ATI, DEF, HP, Exp;///初始攻击,防御,血量, 经验值
}p[Bit]; struct LvBu
{///吕布的个人属性
int ATI, DEF, HP, Exp;///初始攻击,防御,血量
int In_ATI,In_DEF,In_HP;///每升一级增加的攻击防御血量 LvBu newLvBu(int x, int hp, Enemies p[])
{///状态x时候吕布的属性,血值
LvBu result;
result.HP = hp;///血量等于传的最大血量值
int sumExp=;
for(int i=; x; i++)
{
if(x & )
sumExp += p[i].Exp;
x >>= ;
} int Lv = sumExp / MaxExp;///计算级别 result.ATI = ATI + In_ATI * Lv;
result.DEF = DEF + In_DEF * Lv;
result.Exp = sumExp % MaxExp;
result.In_HP = In_HP; return result;
}
int Fight(const Enemies &p)
{///如果吕布能打过,返回剩余的血量,如果不能打过返回0
int Kill_En = p.HP, Kill_Lb = HP;///杀死敌人需要的次数,杀死吕布需要的次数 if(ATI > p.DEF)
{///如果卢布的攻击大于敌人的防御
Kill_En = p.HP / (ATI-p.DEF) + (p.HP%(ATI-p.DEF) ? : );
}
if(p.ATI > DEF)
{///如果敌人的攻击大于卢布的防御
Kill_Lb = HP / (p.ATI-DEF) + (HP%(p.ATI-DEF) ? : );
} if(Kill_En == )
Kill_En = ;///防止对方血量刚开始就为0 int LastHP = ; if(Kill_En <= Kill_Lb)
{///因为吕布先攻击,所以如果攻击次数小于或等于敌人的话,那么就可以杀死对方
if(p.ATI > DEF)
LastHP = HP - (Kill_En-) * (p.ATI-DEF);
else
LastHP = HP - (Kill_En-);///不破防,强制每次掉一滴血
if(p.Exp+Exp >= MaxExp)
LastHP += In_HP;///判断杀死这个敌人后是否能升级
} return LastHP;
}
}; int main()
{
LvBu Lb; while(scanf("%d%d%d%d%d%d", &Lb.ATI, &Lb.DEF, &Lb.HP, &Lb.In_ATI, &Lb.In_DEF, &Lb.In_HP) != EOF)
{///吕布的个人属性
int i, j, N; memset(dp, false, sizeof(dp)); scanf("%d", &N); for(i=; i<N; i++)
{///敌人的属性
scanf("%*s%d%d%d%d", &p[i].ATI, &p[i].DEF, &p[i].HP, &p[i].Exp);
} dp[] = Lb.HP; int M = <<N; for(i=; i<M; i++)
{
if(dp[i])
{///如果有血量,先构造当前血量时卢布的状态
LvBu newLb = Lb.newLvBu(i, dp[i], p); for(j=; j<N; j++)
{
if( !(i & (<<j)) )
{///第j位为0,表示敌人j存活,计算杀死敌人j剩余的血量
dp[i|(<<j)] = max(dp[i|(<<j)], newLb.Fight(p[j]));
}
}
}
} if(dp[(<<N)-] == )
printf("Poor LvBu,his period was gone.\n");
else
printf("%d\n", dp[(<<N)-]);
} return ;
}
God of War - HDU 2809(状态压缩+模拟)的更多相关文章
- HDU 2809 God of War(DP + 状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 题目大意:给出战神吕布的初始攻击力ATI.防御力DEF.生命值HP.每升一级增加的攻击力In_A ...
- HDU 1074 (状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...
- hdu 4739(状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4739 思路:状态压缩. #include<iostream> #include<cs ...
- HDU 3341 状态压缩DP+AC自动机
题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...
- hdu 2167(状态压缩基础题)
题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...
- hdu 1565(状态压缩基础题)
题意:容易理解. 分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!! 代码实现: #inclu ...
- HDU 2553 状态压缩
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 3006(状态压缩)
The Number of set Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu 2489(状态压缩+最小生成树)
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 4033 状态压缩枚举
/* 看别人的的思路 搜索搜不出来我太挫了 状态压缩枚举+好的位置 */ #include<stdio.h> #include<string.h> #define N 20 i ...
随机推荐
- iOS SDwebImage 使用说明
SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下 ...
- UITabBar的隐藏
方式一: // 重写导航控制器的push方法 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL) ...
- Android Studio中JNI -- 1 -- 配置方法
1.配置NDK 1.1 下载NDK Android Studio 1.2 配 android-ndk-r10e,不同版本的Studio需要配置不同的ndk,下载完成后,随便解压放至某个文件目录下 1. ...
- Balsamiq Mockups
Balsamiq Mockups完全手册 2010.03.18 发布 48,066 浏览 什么是Balsamiq Mockups Balsamiq Mockups出自加利福尼亚州的Balsamiq工作 ...
- memcached在windows安装
下载地址: http://s3.amazonaws.com/downloads.northscale.com/memcached-win64-1.4.4-14.ziphttp://s3.amazona ...
- Python疑问系列
最近在看python源码 ------点点滴滴做个记录. 预计要分的系列: 1. import 分析 2. 主要bytecode 分析 3. python启动分析 4. object对象分析 最后希望 ...
- linux 查看端口号命令
Linux下如果我们需要知道2809号端口的情况的话,我们可以这样,如下命令: $netstat -pan|grep 24800 tcp 0 0 0.0.0.0:24800 ...
- 解决VS2015无法调试dotnet core项目
dotnet core 1.0正式版和VS2015 update3安装后一直无法在VS中正常调试. 错误提示:The debugger's worker process (msvsmon.exe) u ...
- python相关的工具
在使用python的时候,发现Adaconda工具包真的很不错,里面集合了很多的工具,并且,自带了很多的python常用模块 另外,PyCharm编辑器也是不错的,界面清晰,可以实现数据的可视化
- C#Lambda表达式学习日记
Lambda表达式只是用更简单的方式来写匿名方法,彻底简化了对.NET委托类型的使用. 现在,如果我们要使用泛型 List<> 的 FindAll() 方法,当你从一个集合去提取子集时,可 ...