1040 有几个PATpython3无超时

这道题思路来自于PAT 1040 有几个PAT python (无超时)

1、最初代码

#!/usr/bin/env python
# -*-coding:utf-8 -*-
'''
@File    :   1040.py
@Time    :   2020/04/21 09:40:16
@Author  :   Schiller Xu 
@Version :   1.0
@License :   (C)Copyright 2020-2021, SchillerXu
@Desc    :   None
'''

s=input()
n=0

for i in range(len(s)-1):
    if s[i]=='A':
        n=n+s[0:i].count('P')*s[i+1:].count('T')

n=n%1000000007

print(n)

思路是以A为基准,如果A前面有a个“P”,A后面有b个“T”,那就可以组成 a ∗ b a*b ab个PAT,但是在多个A的情况下,count有很多计算是多余的。

2、改进代码

这道题比较有意思的是解题的思路,先算P的个数,再算PA的个数,再算PAT的个数。

代码如下:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
'''
@File    :   1040-1.py
@Time    :   2020/07/20 09:40:34
@Author  :   Schiller Xu 
@Version :   1.0
@License :   (C)Copyright 2020-2021, SchillerXu
@Desc    :   None
'''

n = input()
count_P = count_PA = count_PAT = 0
for i in n:
    if i=='P':
        count_P += 1
    elif i=='A':
        count_PA += count_P
    else:
        count_PAT += count_PA
print(count_PAT % 1000000007)

思路很清奇,可以用来解决很多类似的问题。

3、参考资料

PAT 1040 有几个PAT python (无超时)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值