CF1862E 题解
思路
这题中 可能是非正数,非正数我们肯定不选。我们设最后一个被选中的数的下标是 ,则最优策略就是选择前 个数中前 大的数,并以下标从小到大的顺序去走,这样总共答案就是前 个数中前 大的数之和减去 即可,最后,我们只要对每个 算出来的答案取 即可。
前 个数的前 大值我们可以定义一个优先队列 用于存储前 大值,再定义变量 表示 内的数之和即可。
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll; //不开 ll 见祖宗
ll t, n, x, sum, maxx, m, d;
priority_queue <ll, vector <ll>, greater <ll>> q; //小根堆
ll f () {
sum = maxx = 0; //多组数据要清零
while (! q.empty ()) //多组数据要清空
q.pop ();
cin >> n >> m >> d;
while (n --) {
cin >> x;
if (x > 0) { //是正数才要添加
q.push (x), sum += x;
if (q.size () > m) //超过了 m 个,舍弃一个最小值
sum -= q.top (), q.pop ();
}
sum -= d; //又要减掉一个 d 了
maxx = max (maxx, sum); //取 max
}
return maxx;
}
int main () {
cin >> t;
while (t --)
cout << f () << '\n';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现