题目大意:貌似是一个游戏,首先给出卢布的攻击,防御,还有血量,再给出每升一级增加的攻击防御还有血量,然后又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(状态压缩+模拟)的更多相关文章

  1. HDU 2809 God of War(DP + 状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 题目大意:给出战神吕布的初始攻击力ATI.防御力DEF.生命值HP.每升一级增加的攻击力In_A ...

  2. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  3. hdu 4739(状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4739 思路:状态压缩. #include<iostream> #include<cs ...

  4. HDU 3341 状态压缩DP+AC自动机

    题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...

  5. hdu 2167(状态压缩基础题)

    题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...

  6. hdu 1565(状态压缩基础题)

    题意:容易理解. 分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!! 代码实现: #inclu ...

  7. HDU 2553 状态压缩

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. hdu 3006(状态压缩)

    The Number of set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. hdu 2489(状态压缩+最小生成树)

    Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  10. hdu 4033 状态压缩枚举

    /* 看别人的的思路 搜索搜不出来我太挫了 状态压缩枚举+好的位置 */ #include<stdio.h> #include<string.h> #define N 20 i ...

随机推荐

  1. iOS SDwebImage 使用说明

    SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下 ...

  2. UITabBar的隐藏

    方式一: // 重写导航控制器的push方法 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL) ...

  3. Android Studio中JNI -- 1 -- 配置方法

    1.配置NDK 1.1 下载NDK Android Studio 1.2 配 android-ndk-r10e,不同版本的Studio需要配置不同的ndk,下载完成后,随便解压放至某个文件目录下 1. ...

  4. Balsamiq Mockups

    Balsamiq Mockups完全手册 2010.03.18 发布 48,066 浏览 什么是Balsamiq Mockups Balsamiq Mockups出自加利福尼亚州的Balsamiq工作 ...

  5. memcached在windows安装

    下载地址: http://s3.amazonaws.com/downloads.northscale.com/memcached-win64-1.4.4-14.ziphttp://s3.amazona ...

  6. Python疑问系列

    最近在看python源码 ------点点滴滴做个记录. 预计要分的系列: 1. import 分析 2. 主要bytecode 分析 3. python启动分析 4. object对象分析 最后希望 ...

  7. linux 查看端口号命令

    Linux下如果我们需要知道2809号端口的情况的话,我们可以这样,如下命令: $netstat -pan|grep 24800 tcp        0      0 0.0.0.0:24800   ...

  8. 解决VS2015无法调试dotnet core项目

    dotnet core 1.0正式版和VS2015 update3安装后一直无法在VS中正常调试. 错误提示:The debugger's worker process (msvsmon.exe) u ...

  9. python相关的工具

    在使用python的时候,发现Adaconda工具包真的很不错,里面集合了很多的工具,并且,自带了很多的python常用模块 另外,PyCharm编辑器也是不错的,界面清晰,可以实现数据的可视化

  10. C#Lambda表达式学习日记

    Lambda表达式只是用更简单的方式来写匿名方法,彻底简化了对.NET委托类型的使用. 现在,如果我们要使用泛型 List<> 的 FindAll() 方法,当你从一个集合去提取子集时,可 ...