A. Rectangle Cutting
几何,数学
题意判断能否将矩形平分并重新拼接为不同的矩形
小边能平分,或者长边能平分且不是短边的二倍,则一定可以拼成不同的矩形,否则不行
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
排序,贪心,双指针
题意让数组每个元素加上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
数学,约数,暴力
题意,数列由一组固定的数字重复组成,每一组由2k-2个元素组成,且分为两个部分,前半部分由1递增到k,后半部分由k-1递减到2,求第n个元素是x时,可能的k的数量
按该元素在一组中可能出现的位置,可以分两种情况讨论:
- 该元素出现在前半部分,前面n-x个元素恰好可以划分成若干个某种大小的组,试除法求n-x所有约数,约数即为可能的组的大小,求其k值并检查是否可以出现x,可以则存储k值
- 该元素出现在后半部分,将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))