Codeforces Round 924 (Div. 2)(A~C) python

A. Rectangle Cutting

Problem - A - Codeforces

几何,数学

题意判断能否将矩形平分并重新拼接为不同的矩形

小边能平分,或者长边能平分且不是短边的二倍,则一定可以拼成不同的矩形,否则不行

def check(a0, b0):
    a, b = min(a0, b0), max(a0, b0)
    if a % 2 == 0:
        return True
    elif b % 2 == 0 and b != a*2:
        return True
    return False


t = int(input())
for _ in range(t):
    a, b = map(int, input().split())
    if check(a, b):
        print("YES")
    else:
        print("NO")

B. Equalize

Problem - B - Codeforces

排序,贪心,双指针

题意让数组每个元素加上1到n的排列中的一个数,求出现次数最多数字的出现次数的最大值

相同数字加上不同值后一定不同,即每种相同元素在答案在只会出现一次,将数组去重并排序

假设出现次数最多的为当前元素ai加一时,那么只有它前面比他小n-1以内的数字,可以通过加上排序中另一个非1的数来凑出ai+1,

使用双指针来维护前面在范围内的元素的数量,取最大值

t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    a = sorted(list(set(a)))
    res = 0
    las, num = 0, 0
    for ai in a:
        while ai+1 > a[las]+n:
            num -= 1
            las += 1
        num += 1
        res = max(res, num)
    print(res)

C. Physical Education Lesson

Problem - C - Codeforces

数学,约数,暴力

题意,数列由一组固定的数字重复组成,每一组由2k-2个元素组成,且分为两个部分,前半部分由1递增到k,后半部分由k-1递减到2,求第n个元素是x时,可能的k的数量

按该元素在一组中可能出现的位置,可以分两种情况讨论:

  1. 该元素出现在前半部分,前面n-x个元素恰好可以划分成若干个某种大小的组,试除法求n-x所有约数,约数即为可能的组的大小,求其k值并检查是否可以出现x,可以则存储k值
  2. 该元素出现在后半部分,将x出现的组补充完整,即总共n+x-2个元素,并查找可能的k值

试除法求约数时,i要从1开始,因为有可能将所有元素划分成一组,若较大的n//i求出的k值小于x时,可直接退出,最后打印不同的k的个数

def check(i):
    return i % 2 == 0 and (i + 2) // 2 >= x


def get_div(n):
    i = 1
    while i <= n / i:
        if n % i == 0:
            if check(i):
                k[(i + 2) // 2] = 1
            if n // i != i and check(n // i):
                k[(n // i + 2) // 2] = 1
            if (n // i + 2) // 2 < x:
                break
        i += 1


t = int(input())
for _ in range(t):
    n, x = map(int, input().split())
    k = dict()
    get_div(n - x)
    get_div(n + x - 2)
    print(len(k))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值