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;
}
原文地址:https://www.cnblogs.com/WWHHTT/p/9872856.html