题目大意:貌似是一个游戏,首先给出卢布的攻击,防御,还有血量,再给出每升一级增加的攻击防御还有血量,然后又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. Maven配置jar(war)包自动打包上传Maven服务器的配置

    Maven配置jar(war)包自动打包上传Maven服务器的配置 创建jar(war)包工程 创建一个maven工程 在工程中穿件一个测试类 配置pom.xml <distributionMa ...

  2. 关于通过bindService启动的service,在unbindService后service是否继续运行的讨论

    有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定.具体的启动情况有下: 1.当启动时,单独调用bindService方法,在unbindService后,会 ...

  3. [C#][转]与MySql连接访问

    using System;using System.Configuration;using MySql.Data.MySqlClient;/// <summary>/// TestDate ...

  4. XhProf安装教程–详细教程

    wget去这里找最新的包下载,我现在最新的是xhprof-0.9.4.tgz cd /tmp mkdir xhprof && cd xhprof wget http://pecl.ph ...

  5. Photon开发实战(2)——开发框架、第一个Photon程序

    Photon基础开发框架 Photon (v4)的基本框架.开发框架主要Photon和游戏逻辑(C#)两个部分,如下图最新的Photon v4支持的4种底层协议,游戏开发逻辑Photon目前主要划分为 ...

  6. 更改input【type=file】样式

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. AppDomain与进程、线程、Assembly之间关系

    AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序 AppDomain是CLR实现代码隔离的基本机制.   每一个AppDomain可以单独运行.停止:每个AppD ...

  8. Python核心编程2第三章课后练习

    1. 标识符.为什么Python 中不需要变量名和变量类型声明? Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程.每个变量在内存中创建,都包括变量的标识,名称和数据这些信息.每 ...

  9. python随机数

    前提:需要导入random模块 >>>import random 1.random.random random.random()用于生成一个0到1的随机符小数: 0 <= n ...

  10. 2016022610 - redis列表命令集合

    参考网址:http://www.yiibai.com/redis/redis_lists.html Redis列表是简单的字符串列表,排序插入顺序.您可以在头部或列表的尾部Redis的列表添加元素.列 ...