时间限制:
1000ms
单点时限:
1000ms
内存限制:
256MB
-
3 1 1 D W 8 8 4 2 D
样例输出
-
5
-
#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; struct ser { int att,hp; bool w,d; }a[10]; int ans,n,num[10]; void dfs(int res,int hurt,int step,bool fir) { if(step==n) { if(res>=8) ans=max(ans,hurt); return; } int i=num[step]; if(fir) { fir=false; if(a[i].w) { if(a[i].d||a[i].hp>8) { dfs(res,hurt+a[i].att,step+1,fir); dfs(res+a[i].att,hurt,step+1,fir); } } dfs(res,hurt,step+1,fir); } else { if(a[i].w) { dfs(res,hurt+a[i].att*2,step+1,fir); if(a[i].d||a[i].hp>8) { dfs(res+a[i].att,hurt+a[i].att,step+1,fir); dfs(res+a[i].att*2,hurt,step+1,fir); } } dfs(res+a[i].att,hurt,step+1,fir); dfs(res,hurt+a[i].att,step+1,fir); } } int main() { char c; while(scanf("%d",&n)!=EOF) { ans=0; for(int i=0;i<n;i++) { scanf("%d%d",&a[i].att,&a[i].hp); a[i].w=a[i].d=false; while(scanf("%c",&c)!=EOF) { if(c=='\n') break; if(c=='W') a[i].w=true; else if(c=='D') a[i].d=true; } } for(int i=0;i<n;i++) num[i]=i; for(int i=0;i<n;i++){ swap(num[i],num[0]); dfs(0,0,0,true); } printf("%d\n",ans); } return 0; }
这一题是多组测试样例,WA了半天才知道,然后这一题有几个我个人想多了的地方。 -
首先一个随从攻击一次之后,只要他能攻击第二次,他就能满足条件的情况下攻击玩家,并且他的攻击时间不必紧跟,可以在之后的任何时间攻击。
-
对此,每次对单个随从的攻击做出一些假设,只要最终 诺兹多姆遭受超过8的攻击就可以了,选取最终的最大值。
描述
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能对对方玩家造成的最大伤害。