您的位置:首页 > 其它

Codeforces Round #159 (Div. 2)

2015-04-21 16:52 375 查看
A. Sockets

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

#include <iostream>
#include <queue> //使用priority_queue必须包含的头文件
using namespace std;
int main()
{
int n, m, k,a,i,ans=0;
cin >> n >> m >> k;
priority_queue<int> pq;
for (i = 0; i<n; i++)
{
cin >> 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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: