C Flower City Fence
模拟
时间复杂度:O(n)。虽然是for+while两重循环,根据条件判断并不是O(n2)
空间复杂度:
# import sys
#
# sys.stdin = open('input.txt', 'r')
def main():
# test case number
tcn = int(input())
for _ in range(tcn):
n = int(input())
nums = [int(x) for x in input().split()]
flower_city_fence(n, nums)
def flower_city_fence(n, nums):
h = nums[0]
if h != len(nums):
print('NO')
return
rst = [0 for _ in range(h)]
j = n - 1
for i in range(h):
while True:
if nums[j] - i > 0:
break
else:
j -= 1
rst[i] = j + 1
if rst == nums:
print('YES')
else:
print('NO')
if __name__ == '__main__':
main()
D Ice Cream Balls
排列组合,二分查找。
exactly 准确构成n种排列。
思路,先选择m种冰淇淋,构成m(m-1)/2种冰淇淋,差一点点就到达n的那个m,再依次选择重复冰淇淋,step by step(每次加一),然后慢慢递增到n。
# import sys
# sys.stdin = open('input.txt', 'r')
def main():
# test case number
tcn = int(input())
for _ in range(tcn):
n = int(input())
ice_cream_balls(n)
def ice_cream_balls(n):
l = 0
r = 10 ** 18
while r - l > 1:
m = (l + r) // 2
if m * (m - 1) // 2 <= n:
l = m
else:
r = m
print(l + (n - l * (l - 1) // 2))
if __name__ == '__main__':
main()
E Kolya and Movie Theatre
数学,堆,选择。
import heapq
import sys
# sys.stdin = open('input.txt', 'r')
def main():
# test case number
tcn = int(input())
for _ in range(tcn):
n, m, d = [int(x) for x in input().split()]
a = [int(x) for x in input().split()]
movie_theatre(n, m, d, a)
def movie_theatre(n, m, d, a):
rst = 0
hq = []
v = 0
for i in range(n):
if a[i] < 0:
continue
if len(hq) < m:
v += a[i]
heapq.heappush(hq, a[i])
rst = max(rst, v - (i + 1) * d)
else:
if a[i] < hq[0]:
continue
else:
v += a[i] - hq[0]
heapq.heappushpop(hq, a[i])
rst = max(rst, v - (i + 1) * d)
# print(hq)
print(rst)
if __name__ == '__main__':
main()