传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3008
题意:需要打一只boss,小明和boss都是每秒攻击一次,但是是小明先攻击boss。小明和boss的血量都是100,小明的普通攻击为1,当然除了普通攻击外,小明还有魔法攻击,小明的魔法量也是100,每次魔法攻击都需要扣除一定量的魔法值,boss的攻击力是固定的为q,小明有n种魔法技能,在小明每次攻击之后会回复t点魔法值,每种魔法技能伤害为bi,耗费魔法值为ai,然后问小明打死boss所要用的最少时间,当然如果小明不能打死boss,输出My god
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int kill[ 105 ], cost[ 105 ], dp[ 105 ];
//dp[i][j],i代表第几轮攻击,j代表怪剩余血量,dp[i][j代表剩余蓝量。
int max( int a, int b)
{
return a> b? a: b;
}
int main ()
{
int n, t, q;
while ( scanf( "%d%d%d" ,& n,& t,& q), n+ t+ q)
{
int i, j, k, T;
for ( i= 1 ; i<= n; i++)
scanf( "%d%d" ,& cost[ i],& kill[ i]);
if ( 100 % q== 0 )
T= 100 / q;
else
T= 100 / q+ 1 ;
memset( dp,- 1 , sizeof ( dp));
dp[ 100 ]= 100 ;
kill[ 0 ]= 1 ; cost[ 0 ]= 0 ;
bool ok= false ;
for ( i= 1 ; i<= T; i++)
{
for ( j= 1 ; j<= 100 ; j++)
{
if ( dp[ j]==- 1 )
continue ;
for ( k= 0 ; k<= n; k++)
{
if ( j<= kill[ k]&& cost[ k]<= dp[ j])
{
printf( "%d\n" , i);
ok= true ; break ;
}
else if ( j> kill[ k]&& cost[ k]<= dp[ j])
{
dp[ j- kill[ k]]= max( dp[ j- kill[ k]], dp[ j]- cost[ k]+ t);//这里自己还不是很清楚!
}
}
if ( ok) break ;
}
if ( ok) break ;
}
if (! ok) printf( "My god\n" );
}
return 0 ;
}