死亡
【问题描述】
现在有个位置可以打sif,有个人在排队等着打sif。现在告诉你前个人每个人需要多长的时间打sif,问你第个人什么时候才能打sif。(前个人必须按照顺序来)
【输入格式】
第一行两个整数如上所述。
接下来行每行一个整数代表每个人所需要用的时间。
【输出格式】
一行一个整数表示答案。
【样例输入】
3 2
1
1
1
【样例输出】
1
【样例解释】
山里有座庙。
【数据规模与约定】
对于的100%数据,每个人所需用的时间不超过10^5。
测试点 |
测试点 |
||||
1 |
10 |
10 |
1 |
5000 |
500 |
2 |
20 |
10 |
2 |
100000 |
5000 |
3 |
50 |
10 |
3 |
100000 |
10000 |
4 |
1000 |
500 |
4 |
100000 |
20000 |
5 |
2000 |
500 |
5 |
100000 |
50000 |
题解:用一个优先队列轻松解决。由于优先队列由大到小排列,因此可以将时间的相反数压入队列,每次取栈顶元素。
#include<cstdio> #include<iostream> #include<queue> #include<algorithm> #include<cstring> #define N 100100 using namespace std; int n,m; int t[N]; long long ans; priority_queue<long long> q; int main() { freopen("death.in","r",stdin); freopen("death.out","w",stdout); scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&t[i]); for (int i=1;i<=m;i++) q.push(0); for (int i=1;i<=n;i++) { long long k=q.top(); q.pop(); k=-k; k+=t[i]; k=-k; q.push(k);//取相反数压入栈中 } ans=-q.top(); cout<<ans<<endl; fclose(stdin); fclose(stdout); return 0; }
优先队列
时间: 2024-10-14 00:42:46