A. Turtle Puzzle: Rearrange and Negate
签到题,贪心
因为可以任意排序,将所有负的放在一起乘-1,结果最大
B. Turtle Math: Fast Three Task
模拟,数论
数组的和模3为0时不用操作,模3为2时任选一个元素加一即可,模三为1时,数组中有模为一的删除一个即可,否则选一个元素加一两次
C. Turtle Fingers: Count the Values of k
暴力,数论
暴力枚举x,y从0开始的取值,看能否找到k,找到放入集合,最后看k种类数
t = int(input())
for _ in range(t):
a, b, l = map(int, input().split())
se = set()
na = 1
while na <= l and l % na == 0:
nb = 1
while l % (na*nb) == 0:
se.add(l//na//nb)
nb *= b
na *= a
print(len(se))
D. Turtle Tenacity: Continual Mods
构造,贪心,数论
数组可以任意排序,统计各数字数目,x<y, x%y=x,若最小的数字仅出现一次,从小到大排序结果一定非零,
否则,若有元素模最小的数字不为0,则模出的元素一定比最小的还小,此时用该模数依次模其他元素,结果一定非零
from collections import Counter
def check():
mi = min(a)
if c[mi] == 1:
return True
for ci in c:
if ci % mi != 0:
return True
return False
t = int(input())
for _ in range(t):
n = int(input())
a = list(map(int, input().split()))
c = Counter(a)
if check():
print("YES")
else:
print("NO")
E. Turtle vs. Rabbit Race: Optimal Trainings
二分,三分,数学,前缀和
前缀和优化求l到r间共有多少部分,二分刚好不使u+1-k小于0的r1和刚好使u+1-k小于等于0的r2,然后判断最终成绩,选成绩大的r,如果相等选r较小的
def f(u, p):
return max(0, p*(2*u-p+1)//2)
t = int(input())
for _ in range(t):
n = int(input())
a = list(map(int, input().split()))
s = [0]
for ai in a:
s.append(s[-1]+ai)
q = int(input())
lu = [list(map(int, input().split())) for _ in range(q)]
for li, ui in lu:
l1, r1 = 0, n
while l1 < r1:
mid = (l1+r1+1)//2
if s[mid] - s[li-1] <= ui:
l1 = mid
else:
r1 = mid - 1
l2, r2 = 0, n
while l2 < r2:
mid = (l2 + r2) // 2
if s[mid] - s[li - 1] >= ui:
r2 = mid
else:
l2 = mid + 1
if r1 == r2:
res = r1
elif f(ui, s[r1]-s[li-1]) >= f(ui, s[r2]-s[li-1]):
res = r1
else:
res = r2
res = max(res, li)
print(res, end=" ")
print()
F. Turtle Mission: Robot and the Earthquake
o搜索,bfs,图论,模拟
石头会一直整体向上运动,以石头为参考系,假设石头是不动的,机器人不可碰到石头,每秒钟机器人及终点可以进行以下操作:
- 机器人向上,机器人与石头相对位置不变,
- 机器人向下,机器人相对循环向下两格,需要机器人下两格内非石头
- 机器人向右,机器人相对循环向右下移动一格
机器人每次操作时,终点都会相对循环向下移动一格
bfs,遍历机器人可能走过的位置,最后和终点相遇时取较小的一个,
机器人向上的操作仅改变终点的位置,仅在最后一列处考虑即可
from collections import deque
def solve():
ans = int(1e15)
if mp[0][0] == 1:
return -1
st = [[True]*m for _ in range(n)]
h = deque([(0, 0, 0)])
while h:
x, y, s = h.popleft()
if y == m-1:
end = (n - 1 + s) % n
if end > x:
c = x + n - end
else:
c = x-end
ans = min(ans, s+c)
nx, ny = (x+2) % n, y
if not mp[(x+1) % n][ny] and not mp[nx][ny] and st[nx][ny]:
st[nx][ny] = False
h.append((nx, ny, s+1))
nx, ny = (x+1) % n, y+1
if ny < m and not mp[nx][ny] and st[nx][ny]:
st[nx][ny] = False
h.append((nx, ny, s+1))
return ans
t = int(input())
for _ in range(t):
n, m = map(int, input().split())
mp = [list(map(int, input().split())) for _ in range(n)]
res = solve()
if res == int(1e15):
res = -1
print(res)