A. Thorns and Coins
签到题,贪心,模拟
第一个连续的棘刺前的硬币均能吃到
t = int(input())
for _ in range(t):
n = int(input())
s = input().split("**")[0]
res = s.count("@")
print(res)
B. Chaya Calendar
数论
下个预言会在下一个能被当前ai整除的年数出现,即(now // a[i] + 1)*a[i]年
t = int(input())
for _ in range(t):
n = int(input())
a = list(map(int, input().split()))
now = a[0]
for i in range(1, n):
now = (now // a[i] + 1)*a[i]
print(now)
C. LR-remainders
x模拟,数学
要求每个操作前所有元素乘积对m的模数,正着求数字相乘会很大,并且左右都会变化无法用前缀和,但是倒着求,每次添加一个元素,就有一个固定的顺序,当然这样求的答案是倒序的
存一下删除的顺序,逆序求当前的模数,每个位置只使用当前模数相乘即可,记录当前答案,最后将答案逆序打印
t = int(input())
for _ in range(t):
n, m = map(int, input().split())
a = list(map(int, input().split()))
ops = input()
l, r = 0, n-1
lis = []
for op in ops:
if op == "L":
lis.append(l)
l += 1
else:
lis.append(r)
r -= 1
res = []
now = 1
for i in range(n-1, -1, -1):
now = now * a[lis[i]] % m
res.append(now)
i += 1
for i in range(n-1, -1, -1):
print(res[i], end=" ")
print()
D. Card Game
贪心,模拟
每张牌是不重复的,每回合要求一张牌比同色另一张牌大,或者其中一张是王牌,要求构造一种2n张牌都被使用的顺序,
可以发现每种花色是偶数时,该花色两两配对一定能全部用完,而为奇数时,多出的那张只能与任一张王牌配对,记录每种花色和王牌花色数量,然后看能不能都两两配对,即王牌花色足够补奇数剩余花色且剩余的能被二整除
若可以,每种花色从小到大每次取两张,不够时用王牌补,然后接着打印剩余王牌即可
def check():
num, k = 0, len(al[king])
for i in al:
if i != king:
now = len(al[i])
if now % 2 != 0:
num += 1
return k >= num and (k-num) % 2 == 0
t = int(input())
for _ in range(t):
n = int(input())
king = input()
cards = sorted(input().split())
al = {'C': [], 'D': [], 'H': [], 'S': []}
for cd in cards:
al[cd[1]].append(cd)
if check():
k = 0
for i in al:
if i != king:
j, m = 0, len(al[i])
while j + 1 <= m-1:
print(al[i][j], al[i][j+1])
j += 2
if m % 2 != 0:
print(al[i][-1], al[king][k])
k += 1
for j in range(k, len(al[king]), 2):
print(al[king][j], al[king][j+1])
else:
print("IMPOSSIBLE")
E. Final Countdown
o模拟,数学,前缀和
每秒钟只能改变一个位数的值一次,直到倒计时归零
要求归零需要多少时间,即求n的所有位需要改变多少次
从个位数看起,个位数需要改变的次数为n次,数字每减一都会改变一次,而十位数则改变n//10次,每大概十次才会改变一次,前面同理
那么只要求前i位数字相加即可
数字的位数为4*1e5,直接求肯定会爆,用列表模拟数字,每个元素存一个位数,每位为前i个元素的前缀和,最后将其转换为十进制即可
t = int(input())
for _ in range(t):
n = int(input())
a = list(map(int, input()))
s = [0]
for ai in a:
s.append(s[-1]+ai)
resl = [0]
for i in range(1, n+1):
resl.append(s[i])
for i in range(n, 0, -1):
if resl[i] >= 10:
resl[i-1] += resl[i]//10
resl[i] %= 10
i = 0
while resl[i] == 0:
i += 1
while i < n+1:
print(resl[i], end="")
i += 1
print()