Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
DIABLO魔王和Mini都有三种属性,体力点,攻击点,以及集气点。
两人的攻击方式是这样的:采用回合制。
DIABLO先攻,DIABLO只会攻击,每次攻击可以伤害Mini W点体力点,且DIABLO每攻击一次集气点都会增加10点。
Mini每回合可以选择攻击或者集气,选择攻击则可以伤害DIABLO Q点体力点,但是集气点不会增加。选择集气则可以增加Mini 20点
的集气点。
注意,当Mini连续攻击次数>=5时,他必须要集气一次。
两人攻击的共同点是,当集气点>=100时必须要发出必杀绝招,DIABLO的必杀绝招可以伤害Mini 15点体力点,而Mini的必杀绝招可以
伤害DIABLO 25点的体力点。每次发完必杀绝招,都需要消耗100点集气点。(必杀绝招也算攻击一次,如果集气点>=100时,即
使连续攻击次数>=5,也要放必杀绝招,直到集气点<100)
为了提前打好准备,Mini决定先知道自己有多少种不同的攻击方式可以获得胜利。注意,只要DIABLO体力点<=0就判定Mini这种攻击
方式可以获得胜利,如果Mini的体力点<=0就判定Mini这种攻击方式不可以获得胜利。如果没有一种攻击方式能打败DIABLO则输
出“No answer”(引号不输出)
【输入格式】
两行。
第一行三个数A,W,K,用空格隔开,A表示DIABLO的初始体力点(1<=A<=1000),W表示DIABLLO的攻击点(47<=W<=500),K表示DIABLLO的
初始集气点(0<=K<=500);
第一行三个数B,Q,P,用空格隔开,B表示Mini的初始体力点(1<=B<=1000),Q表示Mini的攻击点(0<=Q<=500),P表示Mini的初始集气
点(0<=P<=5000)
【输出格式】
一个数,表示Mini有多少种不同的攻击方式可以获胜。 无法获胜输出“No answer”(引号不输出)。
Sample Input
100 96 3
53 6 7
Sample Output
No answer
Sample Input2
100 42 5
200 48 47
Sample Output2
4
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t068
【题解】
根据所给的规则,可以写两个void;
互相调用;
模拟回合制游戏的过程;
先判断有没有挤满气;
挤满气了就放大招;
如果没有集满气
对于大魔王,它就只能攻击;
对于人物,它能攻击和集气;
写个dfs就好
【完整代码】
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXN = 110;
int a,w,k,ans = 0;
int b,q,p;
void diablo(int,int,int,int,int);
void mini(int,int,int,int,int);
void diablo(int x1,int x2,int q1,int q2,int lx)
{
if (x1<=0)
{
ans++;
return;
}
if (q1>=100)
mini(x1,x2-15,q1-90,q2,lx);
else
mini(x1,x2-w,q1+10,q2,lx);
}
void mini(int x1,int x2,int q1,int q2,int lx)
{
if (x2<=0)
return;
if (q2>=100)
diablo(x1-25,x2,q1,q2-100,lx+1);
else
{
if (lx>=5)
diablo(x1,x2,q1,q2+20,0);
else
{
diablo(x1,x2,q1,q2+20,0);
diablo(x1-q,x2,q1,q2,lx+1);
}
}
}
int main()
{
//freopen("F:\rush.txt","r",stdin);
rei(a);rei(w);rei(k);
rei(b);rei(q);rei(p);
diablo(a,b,k,p,0);
if (ans==0)
puts("No answer");
else
printf("%d
",ans);
return 0;
}