游游的数组染色
游游的数组染色
游游有一个长度为 nn 的数组 aa,初始时所有元素都是白色的,游游希望选择一些数字涂黑,他的得分计算为:黑色数字的最小值 ++ 黑色数字的个数。
请你帮他算算,他最高可以得到多少分吧。
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
import sysdef solve():# 读取所有输入并转换为整数列表input_data = [int(x) for x in sys.stdin.read().split()]# print(input_data) # 调试用,可以查看输入是否正确解析ptr = 0 # 指针初始位置T = input_data[ptr] # 读取测试用例数量ptr += 1results = [] # 存储每组测试的结果for _ in range(T):# 读取当前测试用例的n和数组n = input_data[ptr]ptr += 1a = input_data[ptr : ptr + n]ptr += n# 处理逻辑a.sort()max_score = 0for i in range(n):current_score = a[i] + (n - i)if current_score > max_score:max_score = current_scoreresults.append(max_score)# 输出所有结果for result in results:print(result)if __name__ == "__main__":solve()
问题回顾
我们需要计算:黑色数字的最小值 + 黑色数字的个数,求这个得分的最大值。
关键思路
- 排序数组:首先将数组从小到大排序。这样当我们选择某个数字作为最小值时,比它大的数字都可以被选择。
- 遍历计算:
- 对于排序后的数组中每个数字
a[i]
,假设它是黑色数字中的最小值 - 那么所有大于等于
a[i]
的数字都可以被涂黑(因为数组已排序,后面的数字都≥a[i]
) - 涂黑的数字个数就是
n - i
(从i
到末尾的所有数字) - 得分就是
a[i] + (n - i)
- 对于排序后的数组中每个数字