题目大意:貌似是一个游戏,首先给出卢布的攻击,防御,还有血量,再给出每升一级增加的攻击防御还有血量,然后又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. X-Plane飞行模拟资源整理一

    计划开一个博客整理一下飞行仿真软件二次开发的相关内容 预计将陆续介绍X-Plane.Microsoft Flight Simulator.FlightGear三个主流飞行模拟器. 此处为目录(占坑,随 ...

  2. Struts2文件配置 登陆页面

    Struts 版本号 struts-2.3.16.3 web.xml 配置 <?xml version=”1.0″ encoding=”UTF-8″?> <web-app versi ...

  3. winform下mapxtreme2008 v7.0 生成release版提示找不到dll问题

    在winform下基于mapxtreme2008 v7.0 生成了一个地图软件,用debug方式运行无误,但改为release版时提示缺少一大堆dll,如: 无法从C:\Program Files ( ...

  4. 动画特效的原生、jQ和CSS3方法

    最近一直在看运动的JS特效,主要看的是原生写法,太麻烦了,最终看到写了个运动的方法,后面可以直接引用,然后发现这个方法和jQ其实差不多了,代码分别如下: 基本的HMTL和CSS <!DOCTYP ...

  5. jquery前端性能优化(持续添加。。。)

    1.选择器的使用 (1)$('#id')   使用id来定位dom元素是性能最高的方法.jQuery底层将直接调用本地方法document.getElementById().如果id直接可以找到所要对 ...

  6. memcached在windows安装

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

  7. 源码编译基于Android平台的XBMC笔记

    参考官方网站:https://github.com/xbmc/xbmc/blob/master/docs/README.android   1. 编译主机系统 Ubuntu (12.04) 64Bit ...

  8. ”ENV_IS_EMBEDDED“解惑以及相关的移植实验

    一.概述( ENV_IS_EMBEDDED的目的) 经典资料 认识     ENV_IS_EMBEDDED只有在CFG_ENV_IS_IN_FLASH或者CFG_ENV_IS_IN_NAND定义了才有 ...

  9. winfrom拷贝文件

    //File.Copy(@"C:\Users\Administrator\Pictures\bg.png", @"g:\images\bg.png", true ...

  10. java相关各种页面跳转

    AK相信页面跳转在这个圈圈圆圆里是个地球人都能经常遇到的事,AK也在平时的工作学习中记录了一些,这里就做一个小小的总结,有任何的疑问和质疑都希望您能告诉我,不用担心后果,必定至少您还能理我,AK万分感 ...