zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Java实现 洛谷 P1049 装箱问题
    (Java实现) 洛谷 P1781 宇宙总统
    (Java实现) 洛谷 P1319 压缩技术
    (Java实现) 蓝桥杯 国赛 重复模式
    qt编写一个只能运行单个实例的程序,不用Windows API
    Chaos Software Google Sync v10.1.1.0 和Syncovery Pro
    C++中new和delete的背后( call edx 调用虚表内的第二个函数(析构函数))
    C++中实现回调机制的几种方式(一共三种方法,另加三种)
    如何将Icon转成Bitmap(对ICON的内部格式讲的比较清楚)
    深入解析控制器运行原理
  • 原文地址:https://www.cnblogs.com/WWHHTT/p/9872856.html
Copyright © 2011-2022 走看看