题目大意:貌似是一个游戏,首先给出卢布的攻击,防御,还有血量,再给出每升一级增加的攻击防御还有血量,然后又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. UWP textbox 只能输入数字

    private void Testbox_TextChanged(object sender, TextChangedEventArgs e) {    var textbox = (TextBox) ...

  2. Linq 构造复杂Json 多表group by

    一个主表A(a1,a2),子表B(a1,b1,b2) ,想得到的结果是 [{a1,a2,Info [{b1,b2},{b1,b2},...}]] var list= from a in A join ...

  3. js操作数据库实现注册和登陆

    自从node-js出现之后,不只是java,php等后端语言可以操作数据库,进行内容的增删改查,javascript简本语言同样具备了该项技能,而且在node下,js具备了很强的操作性和代码的阅读性, ...

  4. java基础(死循环退出选项)

    java程序中为了程序正常运行,需要给无限循环加入一个退出选项,保证程序的可执行性. import java.util.Scanner; public class { public static vo ...

  5. 使用for循环嵌套实现乘法口诀表

    九九乘法表的实现: package com.liaojianya.chapter1; /** * This program demonstrates the way of using * for-lo ...

  6. VBA开发经验总结之二:灵活运用工作表属性

    近期,在帮公司写一个销售管理的工具,高强度的开发激发了我对一些以前既有方式的看法,特将几点开发经验总结在此. 1.将工作表及窗体的公共变量及特征变量写为工作表或窗体的属性.此种方法的优点: ① 采用面 ...

  7. yii2源码学习笔记(十六)

    Module类的最后代码 /** * Registers sub-modules in the current module. * 注册子模块到当前模块 * Each sub-module shoul ...

  8. [Linux]命令行模式切换

    图形界面进入命令:Ctrl+Alt+T 进入终端命令:Ctrl+Alt+F1 or Ctrl+Alt+F2 切换至图形界面:按Alt+F7

  9. 深入了解join用法

    最近面试经常被问到inner join, right join , left join  今晚决定搞清楚这些: 首先先创建两个表: CREATE TABLE Persons ( Id_P int NO ...

  10. Android 网络通信 HTTP

    摘要 1. Http GET 方法访问网站 2. Http POST访问网站 3. HttpClient进行Get方式通信 4. HttpClient进行Post方式通信 -------------- ...