2024年莆田市第四期C++专项第三轮选拔真题(小学组) 新排队接水 题解
P2650 新排队接水
解题思路
这个问题需要找到一种排列顺序,使得所有接水者的满意度乘以他们的接水结束时间的总和最大。关键在于确定哪些人应该接水以及他们的最优排列顺序。
关键观察
正数处理:对于正满意度的用户,我们应该尽可能让他们在后面接水,因为他们的满意度会被时间放大。因此,正数应该按升序排列,这样较小的正数先接水,较大的正数后接水。
负数处理
对于负满意度的用户,我们需要谨慎考虑。如果加入一个负数,它会降低当前总和,但后续所有用户的接水时间都会增加1,这可能带来收益或损失。我们需要计算加入这个负数是否能带来总分的净增加。
算法步骤
对所有满意度进行排序
从最大的满意度开始处理(即排序后的数组从后向前遍历)
对于正数,直接加入队列并更新总分
对于负数,计算加入它是否能增加总分,如果能则加入,否则停止
代码实现
#include <bits/stdc++.h>
using namespace std;
int a