2018蓝桥杯C++A组——三体攻击

问题描述

【题目描述】
在这里插入图片描述
【输入格式】
在这里插入图片描述
【输出格式】
在这里插入图片描述
【样例输入】
在这里插入图片描述

【样例输出】
在这里插入图片描述
【样例解释】
在这里插入图片描述
【数据约定】
在这里插入图片描述

题目解析

暴力法

循环每一轮攻击,当生命值为负数时输出当前攻击轮数并返回。
这道题采用暴力法可以通过70%的数据。

差分数组法

简单举个例子:
若一个数组d初始状态为[8,1,3,6,5,4,2];

  1. [3-5] +2(第三个数到第五个数均+2)
    若给定差分数组c = [0,0,2,0,0,-2,0,0]以及差分数组的前缀和 s = [0,0,2,2,2,0,0]则可以很容易发现三者的关系:
    d [ ] + s [ ] = 本 轮 最 终 状 态 d[]+s[]=本轮最终状态 d[]+s[]=
    因此在遭受本次攻击之后d = [8,1,5,8,7,4,2]
  2. [1-5] -2(第一个数到第五个数均 -2)
    此时c = [-2,0,0,0,2,0,0],s = [-2,-2,-2,-2,-2,0,0]
    因此在遭受本次攻击之后d = [6,-1,1,4,3,4,2]。

在考场中我们如果想不到这种解法,暴力解题也是性价比最高的。

C++代码

#include<bits/stdc++.h>
using namespace std;
int A,B,C,m,a,b,c;
int getInt() //快速输入
{
    char ch = getchar();
    int x=0,f=1;
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
        {
            f = -1;
            ch = getchar();
        }
    }
    while(ch>='0'&&ch<='9')
    {
        x = x*10+ch-'0';
        ch = getchar();
    }
    return x*f;
}
inline int getIndex(int x,int y,int z)
{
    return ((x-1)*b+(y-1))*c+z;
}
int main()
{
    A = getInt();
    B = getInt();
    C = getInt();
    m = getInt();
    a = A+1; b = B+1; c = C+1;
    int *data = new int[a*b*c];
    int (*atk)[7] = new int [m+1][7];
    for(int i=1;i<=A;i++)
        for(int j=1;j<=B;j++)
            for(int k=1;k<=C;k++)
                data[getIndex(i,j,k)] = getInt();
    for(int i=1;i<=m;i++)
    {
        for(int j=0;j<7;j++)
            atk[i][j] = getInt();
        for(int x=atk[i][0];x<=atk[i][1];x++) //层的范围
        {
            for(int y=atk[i][2];y<=atk[i][3];y++) //行的范围
            {
                for(int z=atk[i][4];z<=atk[i][5];z++) //列的范围
                {
                    data[getIndex(x,y,z)]-=atk[i][6];
                    if(data[getIndex(x,y,z)]<0)
                    {
                        cout<<i<<endl;
                        delete []data;
                        delete []atk;
                        return 0;
                    }
                }
            }
        }
    }
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芷汀若静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值