CF2032D - Codeforces Round 983 (Div. 2) C. Trinity 题解
算法 | 题解 | CodeForces
2025年2月27日
思路
不难注意到,要保证可以组成三角形, 即要保证可以组成三角形即可(). 若一个数组(以下简写为)已经有序, 只需要保证即可保证是 “所有互不相同的三元组都成三角形” 的数组. 对于”操作” 中的 “赋值”, 不难注意到, 可以直接忽略 “赋值”这一操作的影响. 所以我们只要对数组进行排序, 并可以找出保证条件成立的最长子数组, 原数组长度减去最长子数组长度即为答案. 通过维护一个滑动窗口, 确保窗口内的元素满足三角形条件, 得出最长子数组.
优化
了简化计算, 我们可以预先计算, 这样在判断三角形条件时可以直接使用来替代.
题解代码
for _ in range(int(input())):
n = int(input())
a = sorted(map(int, input().split()))
b = [sum(i) for i in zip(a[1:], a[:-1])]
left = 0
right = 2
rst = n - 2
while right < n:
while a[right] - b[left] >= 0 and right - left >= 2:
left += 1
rst = min(rst, n - (right - left + 1))
right += 1
print(rst)