时间限制:1000ms
单点时限:1000ms
内存限制:256MB
描述
wuzhengkai是一个炉石传说玩家。
有一天,他碰到对面上了个诺兹多姆并上了嘲讽和圣盾。
诺兹多姆是一个有8点攻击力和8点生命值的随从,这意味着他能够承受总量小于8点的伤害而不死亡,且对于任何攻击他的单位造成8点伤害。
嘲讽意味着当诺兹多姆死亡之前你不能攻击对方玩家。圣盾意味着诺兹多姆受到的第一次伤害为0,然后诺兹多姆失去圣盾。
诺兹多姆的能力是让回合时间变为15s,这导致wuzhengkai来不及计算了。
wuzhengkai场上有一些随从,每个随从有其攻击力和生命值,含义同上。
同时一些随从也具有圣盾。一些随从还具有风怒,使得他若在第一次攻击后存活,则还能够攻击一次。
他想让你帮忙算出这回合他能带给对方玩家多少伤害。
输入
输入包含多组数据。
第一行一个整数n,(0<=n<=7),表示wuzhengkai场上有n个随从。
接下来n行,每行首先两个整数Att和Hp(0<Att<=10,0<Hp<=10),表示该随从的攻击力和生命值
接下来每行可能还有0~2个字母跟在这两个整数之后。字母D表示圣盾,字母W表示风怒。
每行中的内容以一个空格隔开。
输出
对于每组数据,输出一个整数,表示wuzhengkai能对对方玩家造成的最大伤害。
样例输入
3 1 1 D W 8 8 4 2 D
样例输出
5
玩过炉石的好理解一点……
/*
*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <bitset>
#include <stack>
#define ll long long
#define ull unsigned long long
#define inf 0x3f3f3f3f
const int mod=997;
const int N=110;
using namespace std;
int num[10];
int n,sum;
struct node
{
int att,hp;
bool W,D;
} s[10];
void dfs(int nom,int face,int k,bool D)//诺姆生命值,玩家收到伤害,第几个随从,诺姆是否有圣盾
{
if(k>n)
{
if(nom>=8)
sum=max(sum,face);
return;
}
int i=num[k];
if(D)//诺姆有圣盾
{
if(s[i].W)//随从有风怒
{
if(s[i].D||s[i].hp>8)//保证可以攻击两次(有圣盾和血量大于诺姆 的攻击值)
{//该随从第一次攻击诺姆圣盾,第二次留着打脸
dfs(nom,face+s[i].att,k+1,false);
dfs(nom+s[i].att,face,k+1,false);
//该随从第一次攻击诺姆圣盾,第二次攻击诺姆
}
}
dfs(nom,face,k+1,false);//攻击圣盾
}
else//诺姆无圣盾
{
if(s[i].W)//随从有风怒
{
dfs(nom,face+s[i].att*2,k+1,false);//可以直接打脸
if(s[i].D||s[i].hp>8)//保证可以攻击两次(有圣盾和血量大于诺姆 的攻击值)
{
dfs(nom+s[i].att,face+s[i].att,k+1,false);//一次打诺姆,打死诺姆后,第二次打脸
dfs(nom+s[i].att*2,face,k+1,false);//两次都打诺姆,不保证打死
}
}
dfs(nom+s[i].att,face,k+1,false);//打诺姆,不保证打死
dfs(nom,face+s[i].att,k+1,false);//打脸
}
}
int main()
{
while(~scanf("%d",&n))
{
sum=0;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&s[i].att,&s[i].hp);
s[i].D=false;
s[i].W=false;
char ch;
while(~scanf("%c",&ch))
{
if(ch=='\n')
break;
else if(ch=='D')
s[i].D=true;
else if(ch=='W')
s[i].W=true;
}
}
for(int i=1; i<=n; i++)
{
num[i]=i;
}
for(int i=1; i<=n; i++)
{
swap(num[i],num[1]);
dfs(0,0,1,true);
}
printf("%d\n",sum);
}
return 0;
}