【t068】智慧碑

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\n",ans);
    return 0;
}
posted @ 2017-10-04 18:45  AWCXV  阅读(201)  评论(0编辑  收藏  举报