Codeforces Round #159 (Div. 2)
发布日期:2021-06-30 15:14:37 浏览次数:2 分类:技术文章

本文共 844 字,大约阅读时间需要 2 分钟。

题意如下:已有n个插排,第i个插排上边有ai个插口。有m个设备,公寓里有k个插口,这k个插口既可以用来插插排也可以直接将设备插到上面,问最少用几个插排能将所有的设备插在上边。记录这道题的目的在于学习priority_queue的使用。代码如下:

#include 
#include
//使用priority_queue必须包含的头文件using namespace std;int main(){ int n, m, k,a,i,ans=0; cin >> n >> m >> k; priority_queue
pq; for (i = 0; i
> a; pq.push(a); } while (k < m && !pq.empty()) { k = k - 1 + pq.top(); pq.pop(); ans++; } if (k >= m) cout << ans << endl; else cout << -1 << endl; return 0;}
代码精髓的地方就在于priority_queue的使用,下边详细解释一下代码。我首先定义了一个优先队列pq,注意在默认不定义比较函数的情况下,无论队列的入队顺序如何,队列中的元素总是按照从大到小降序,出队的时候也就越大越先出队,这时候使用pq就有了贪心的味道了。然后注意k的定义,k最初为公寓已有的插孔数量,到后来while循环里边变成了每用掉k中的一个插口后剩余的总共可用的插口数量(包括插在插在插口上边的插排上的插口)。while循环条件是一个&&,当两个条件有一个条件不满足的时候即停止循环,即k>=m或者pq为空的时候停止循环。循环停止的时候如果总共可用的插口数量多于设备数量,那么ans即为所求;若是因为pq空而停止,则意味着插排用光了也没有插完所有的设备,这时候输出-1。

转载地址:https://jianzhuwang.blog.csdn.net/article/details/45172519 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++ STL中stack/queue的使用
下一篇:Codeforces Round #163 (Div. 2)

发表评论

最新留言

不错!
[***.144.177.141]2024年05月01日 04时14分29秒