時間限制: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;
}