牛客周赛Round28(ABCDE - Python)

第一次用Python写题解,可能会有疏漏之处

官方讲解 讲解

A题

很简单的一道语法题,直接相加输出即可

li = list(map(int, input().split()))
print(sum(li))

B题

取出所有连续长度2字串,排序输出即可

s = input()
li = []
for i in range(len(s) - 1):
    j = i + 1
    ss = s[i] + s[j]
    li.append(ss)
nli = sorted(li)
for i in range(len(nli)):
    print(nli[i])

C题

一道模拟题吧,优化的话就是记录高度(两种写法),然后按照高度把上面的砖块炸掉(和炸下面是一样的)

n, m, k = map(int, input().split())
li = [['*'] * m for i in range(n)]
h = [n] * m # 注意这个地方影响后面的写法
for _ in range(k):
    x, y = map(int, input().split()) # 下标从1开始的,后面操作别忘了-1 
    if li[x - 1][y - 1] == '*':
        li[n - h[y - 1]][y - 1] = '.'
        h[y - 1] -= 1
for row in li:        
    print(''.join(row))

D题

两种解法(双指针 / 前缀和 + 二分),一前一后,需要注意统计数量的细节

n, k = map(int, input().split())
li = list(map(int, input().split()))
l, summ, cnt = 0, 0, 0
for r in range(n):
    summ += li[r]
    while summ >= k: # 当左指针满足条件时,把左指针移到边界处
        summ -= li[l]
        l += 1
    cnt += l # 脑补或者画图
print(cnt)

E题

一道数学题,主要是找规律,手写快速幂稳过

def pow(b, v):
    r = 1
    while v > 0:
        if v % 2 == 1:
            r = r * b % mod
        v //= 2
        b = b * b % mod
    return r
n, k = map(int, input().split())
mod = int(1e9 + 7)
# x奇数能取(k + 1) // 2个,y偶数能取k // 2个,要模拟三个位置
x, y = (k + 1) // 2, k // 2
n1 = (n + 2) // 3
n2 = (n + 1) // 3
n3 = n // 3
ans = pow(y, n)
ans += pow(y, n1) * pow(x, n - n1) % mod
ans += pow(y, n2) * pow(x, n - n2) % mod
ans += pow(y, n3) * pow(x, n - n3) % mod
print(ans % mod)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值