PTA 机工士姆斯塔迪奥 python

首先,惯例看下题目要求:

在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。

你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。

给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。

输入格式:

输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。

接下来 Q 行,每行两个数 Ti​,Ci​,其中 Ti​=0 表示 BOSS 选择的是一整行,Ti​=1 表示选择的是一整列,Ci​ 为选择的行号/列号。行和列的编号均从 1 开始。

输出格式:

输出一个数,表示安全格子的数量。

输入样例:

5 5 3
0 2
0 4
1 3

输出样例:

12

然后,经过简单的数学分析,比如一行一列相交一点,一行两列相交两点,两行三列相交6点,所以要算安全格子时要注意多减去的部分

安全格子数=总的格子数-行数×列宽-列数×行宽+多减去的部分

由于0时为行,1时为列,所以很容易得到下面的代码:

a,b,c=map(int,input().split())
d,e,f=0,0,[]
a1,a2=0,0
for i in range(c):
    f.extend(list(map(int,input().split())))
for i in range(len(f)):
    if f[i]==0:
        d+=1
    elif f[i]==1 and i%2==0:
        e+=1
g=a*b-d*b-e*a+d*e
print(g)

 看上去是不是很好,一检测,发现,有几个测试点始终过不了

回去仔细审题,题目并没有说boos不能连续攻击同一行/列,也即

当这样输入时:

2 3 4
0 1
1 1
1 1
0 1

结果返回0而不是2(画下图就能明白)

那么,问题来了,如何去掉重复的部分呢,我个人是尝试了各种办法,均以失败告终。但功夫不负有心人,我还是寻得了解决办法。从第二次循环开始,每次记录0/1后面的那个数,当下次再遇到时,d/e减1,这样相当于去掉了重复的影响。注意:这里不能用单个变量来记录,不然每次记录的值会变化,我这里用的是列表。最终效果如下:

a,b,c=map(int,input().split())
d,e,f,h1,h2=0,0,[],[],[]
a1,a2=0,0
for i in range(c):
    f.extend(list(map(int,input().split())))
for i in range(len(f)):
    if f[i]==0:
        d+=1
        if i>=1 and f[i+1] in h1:
            a1+=1
        h1.append(f[i + 1])
    elif f[i]==1 and i%2==0:
        e+=1
        if f[i+1] in h2:
            a2+=1
        h2.append(f[i + 1])
d=d-a1
e=e-a2
g=a*b-d*b-e*a+d*e
print(g)

新人报到,请多指教!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值