Sample Input 2
8 4
23 71 87 32 70 93 80 76
Sample Output 2
163
思路:按顺序将每个同学的用水量压入优先队列,然后把最前面的(也就是最小的)元素弹出队列,加上一个紧跟着的后续的同学的用水量,二者之和再重新压入队列,表示该水龙头目前为止必须至少所用时长。最后输出队列的最后一个元素。
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
priority_queue<int, vector<int>, greater<int> > q;
int read()
{
char c=getchar();
int k=0,f=1;
while(c<'0' || c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9')
{
k=k*10+c-'0';
c=getchar();
}
return f*k;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
k=read();
if(i<=m) q.push(k);
else
{
int tmp=q.top();
tmp+=k;
q.pop();
q.push(tmp);
}
}
while(q.size()>1) q.pop();
printf("%d",q.top());
return 0;
}