HDU 3008 Warcraft

题意:一个人有100点血和100点魔法,Boss有100点血,人有n个技能,每个技能对Boss有a[i]点伤害,

且会消耗b[i] 的点魔量,人每秒会有t秒魔法恢复(最大为100)Boss每秒有q点伤害,问人是否能先击败Boss

若能,需要几秒。

dp[i][tmp]:在第 i 秒 剩余 魔法为 tmp 时的伤害,

tmp = 第i秒拥有的魔法 j - a[k]消耗的魔法+t。

dp[i][tmp]=max(dp[i][tmp],dp[i-1][第i秒拥有的魔法 j]+b[k]);

每次找出第 i 秒时有 j 魔法剩余tmp魔法的伤害。

理解:在第 i-1 秒时有 j 点魔法,然后 在 第 i 秒时用第 i-1 秒时的魔法使用第 k个技能 攻击Boss

攻击完后剩余tmp点魔法,以此循环……

#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<map>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
#define INF 1e8
#define eps 1e-8
#define LL long long
#define maxn 100001
#define mol 1000000007

int main()
{
	int n,t,q;
	int dp[105][105];
	int a[105],b[105];
	while(scanf("%d%d%d",&n,&t,&q))
	{
		if(n==0&&t==0&&q==0) break;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&a[i],&b[i]);
		}
		memset(dp,0,sizeof(dp));
		a[0]=0;b[0]=1;
		int flag=0,i;
		for(i=1;(i-1)*q<100;i++)
		{
			for(int j=0;j<=100;j++)
			{
				for(int k=0;k<=n;k++)
				{
					if(j<a[k]) continue;
					int tmp=j-a[k]+t;
					if(tmp>100) tmp=100;
					if(dp[i][tmp]<dp[i-1][j]+b[k])
						dp[i][tmp]=dp[i-1][j]+b[k];
					if(dp[i][tmp]>=100)
					{
						flag=1;
						break;
					}
				}
				if(flag) break;
			}
			if(flag) break;
		}
		if(flag)
			printf("%d\n",i);
		else printf("My god\n");
	}
	return 0;
}

HDU 3008 Warcraft,布布扣,bubuko.com

时间: 2024-11-03 01:21:01

HDU 3008 Warcraft的相关文章

HDU 3008 Warcraft (DP)

题意  你去打boss  开始你的蓝和血还有boss的血都是100   每秒你先打boss一下  然后boss打你一下你减少q点血   你有n个技能  第i个技能耗蓝a[i]  对boss的伤害为b[i]   普攻伤害为1   而且你每秒回复t点蓝(恢复后不超过100)  求你最少可以多少次打死boss 你最多能打100/q或者100/q+1次   令d[i][j]表示第i秒所剩蓝量为j时boss剩下的最少血量   m为j还未恢复蓝之前的蓝量  j = min (100, m + t)   那么

hdu 3008 Warcraft(DP)

题意: 小明和BOSS开始都有100的生命值.小明开始时拥有100魔法值. 小明有N个魔法技能.每个技能消耗ai魔法值同时伤害BOSS bi生命值. 每一秒结束后小明如果还活着则会自动增加魔法值t.[增完魔法值不能超过100] 问小明最少需要多少秒把BOSS干掉.如果没办法干掉输出“MY GOD”. BOSS每秒伤害小明Q点血. 思路: 小明被BOSS干掉的时间一开始就已知.所以只要判断在小明死之前能否把BOSS干掉即可. 第一秒小明选一个技能打,第二秒小明选一个技能打.第三秒...... DP

HDU 3008 DP

基础DP题 打BOSS  BOSS和自己都有100点血,玩家先手 每回合可以选择施放技能攻击(耗蓝,共n种)或者普通攻击(不耗蓝,伤害为1),BOSS每回合会攻击自己q点血,每回合自己会恢复t点法力 方程:  dp[i][j-a[k]+t]=Max(dp[i][j-a[k]+t],dp[i-1][j]+b[k]); #include "stdio.h" #include "string.h" int inf=0x3f3f3f3f; int Max(int a,int

HDU动规46 转载

HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] 收藏 Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955     背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋);        正确的

转载:hdu 动态规划题集

1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955     背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋);    正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i

【转载】 HDU 动态规划46题【只提供思路与状态转移方程】

1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋); 正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v)  其

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include