20181029 T1 教科书般的亵渎
教科书般的亵渎
【问题描述】
小N是一名炉石玩家。
小N在使用术士职业时经常发现自己计算不出来亵渎的最佳方案,所以想请
你写个程序帮帮他。
假设你本回合拥有 M 个随从且均可以攻击,其中第 i 个随从的攻击力为
A2[i],生命值为 B2[i]。对手拥有 N 个随从,其中第 i 个随从的攻击力为
A1[i],生命值为 B1[i]。这些随从均没有异能(可以理解为全体被沉默)。每
次你可以选择一个属于你的攻击力不为 0 且未攻击过的随从攻击对手的
某个未死亡的随从,每次攻击后双方的随从各受到等同于敌人攻击力的伤害,
即均失去等同于敌人攻击力的生命。若某个随从生命值 ≤ 0,则该随从死亡。在
你决定过你每个随从的行动情况(可以不攻击)后,你会打出“亵渎:
对所有随从造成 1 点伤害,若有随从死亡,则重新释放该法术”,如果释放后
所有随从均死亡,则成功打出了一次“教科书般的亵渎”。
请你告诉小N,他能否通过操作随从指定的敌方随从来达成一次“教科书般
的亵渎”。
对于不玩炉石的人来说,刚开始有点不理解,收队了一遍数据也大概懂了
就是一个随从可以打一次,但是也会受到对方攻击力的伤害(这个游戏有点雕)
然后一看书局范围,发现是个SB题
爆搜匹配即可,然后发现没有判断攻击力为零的情况,还有输入反了
白丢了40分
下面给出代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<cstdlib> using namespace std; inline int rd(){ int x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return ; } int n,m; int a[10006],b[10006]; int x[10006],y[10006]; int f=0; int num[10006]; void check(){ for(int i=1;i<=n;i++) num[i]=b[i]; for(int i=n+1;i<=n+m;i++) num[i]=y[i-n]; sort(num+1,num+n+m+1); int i=1; while(num[i]<=0) i++; if(num[i]!=1) return ; i++; for(;i<=n+m;i++) if(num[i]-num[i-1]>1) return ; f=1; return ; } void dfs(int v){ if(f) return ; if(v==n+1){ check(); return ; } dfs(v+1); for(int i=1;i<=m;i++){ if(y[i]>0&&a[v]>0){ y[i]-=a[v]; b[v]-=x[i]; dfs(v+1); y[i]+=a[v]; b[v]+=x[i]; } } return ; } int main(){ n=rd(),m=rd(); for(int j=1;j<=n;j++) x[j]=rd(),y[j]=rd(); for(int i=1;i<=m;i++) a[i]=rd(),b[i]=rd(); dfs(1); if(f) printf("Yes"); else printf("No"); return 0; }
蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿