(python)Codeforces Round 952 (Div. 4)

A.Creating Words

思路:

模拟,注意split()函数的用法

t = int(input())
for i in range(t):
    a = input().split()
    a_ = a[0]
    b_ = a[1]
    a_ = list(a_)
    b_ = list(b_)
    a_[0],b_[0] = b_[0],a_[0]
    s1 = ''
    s2 = ''
    for i in a_:
        s1 += i
    for j in b_:
        s2 += j
    print(s1,s2)

B.Maximum Multiple Sum

思路:

规律题,多试几个数发现3的时候为3,其余情况都为2

t = int(input())
for i in range(t):
    n = int(input())
    if n == 3:
        print(3)
    else:
        print(2)

C.Good Prefixes

思路:

因为要统计前缀,先看第一个数是否为0,若是则count1加1,后面使用sum来更新前缀的和,再用max_a来统计前缀的最大值,从第二个数开始往后遍历,时刻更新sum和max_a的值,若sum-max_a-max_a等于0则count1加1,一直遍历到最后

t = int(input())
for i in range(t):
    n = int(input())
    a = list(map(int,input().split()))
    count1 = 0
    sum = a[0]
    max_a = a[0]
    if a[0] == 0:
        count1 += 1
    for i in range(1,len(a)):
        max_a = max(max_a,a[i])
        sum += a[i]
        if sum - max_a - max_a == 0:
            count1 += 1
    print(count1)

D.Manhattan Circle

思路:

我的想法是把纵坐标和横坐标分别存在list1和list2中,最后取(min(list2)+max(list2))//2和min(list3)+max(list3))//2

t = int(input())
for i in range(t):
    n,m = map(int,input().split())
    list1 = []
    for i in range(n):
        a = input()
        list1.append(list(a))
    list2 = []
    list3 = []
    for i in range(n):
        for j in range(m):
            if list1[i][j] == '#':
                list2.append(i+1)
                list3.append(j+1)
    print((min(list2)+max(list2))//2,()min(list3)+max(list3))//2

E. Secret Box

思路:

S的三个边长都必须被k整除,那么我们可以枚举a,b,然后c用k/(a*b),注意a<=x,b<=y,c<=z,,为了得到每个轴的位置,我们只需将每个轴的移动空间相乘,为(x-a+1) * (y-b+1) * (z-c+1)

每次更新这个值,直到找到最大符合值

t = int(input())
for i in range(t):
    x,y,z,k = map(int,input().split())
    ans = 0
    for a in range(1,x+1):
        for b in range(1,y+1):
            if k % (a*b) != 0:
                continue
            c = k // (a*b)
            if c > z:
                continue
            ways = (x-a+1) * (y-b+1) * (z-c+1)
            ans = max(ans,ways)
    print(ans)

F. Final Boss

思路:

二分答案,注意右边界不要开小了,定义sum每次加上第一回合和可以家的回合可加的伤害

t = int(input())
for i in range(t):
    h,n = map(int,input().split())
    a = list(map(int,input().split()))
    c = list(map(int,input().split()))
    left = 0
    right = 1e16
    max_a = 1e13
    while left <= right:
        sum = 0
        mid = (left + right) // 2
        for i in range(len(a)):
            sum += a[i] * (mid // c[i])
            sum += a[i]
        if sum >= h:
            max_a = min(max_a,mid)
            right = mid - 1
        else:
            left = mid + 1
    print(int(max_a)+1)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值