CSP历年复赛题-P1190 [NOIP2010 普及组] 接水问题
原题链接:https://www.luogu.com.cn/problem/P1190
题意解读:n个人在m个水龙头排队接水,每个人接水量不同,接完水的排队的人可以接上,求总的接水时间。
解题思路:
1、先把前m个人安排在m个水龙头
2、对于m后面的每一个人,都排在目前m个水龙头总接水时间最短的后面
3、最后看m个水龙头最大的累计接水时长即可
如何快速或者m个水龙头总接水时间最短的?可以借助优先队列,小根堆,最后结果就是队列最大的元素即最后一个。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 10005, M = 105;
int n, m;
priority_queue<int, vector<int>, greater<int>> q;
int main()
{
cin >> n >> m;
int w;
for(int i = 1; i <= n; i++)
{
cin >> w;
if(q.size() < m) q.push(w); //如果队列不足m,则入队
else //如果队列超过m
{
int ww = q.top() + w; //将队首出队,加上当前接水量,再次入队
q.pop();
q.push(ww);
}
}
while(q.size() > 1) q.pop();
cout << q.top(); //最后一个即最大值
return 0;
}
分类:
CSP-J复赛真题解析
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通