More Cowbell

来源:互联网 发布:台湾 香港 知乎 编辑:程序博客网 时间:2024/06/06 03:24
链接:http://codeforces.com/problemset/problem/604/B

题目:

Kevin Sun wants to move his precious collection of n cowbells from Naperthrill to Exeter, where there is actually grass instead of corn. Before moving, he must pack his cowbells intok boxes of a fixed size. In order to keep his collection safe during transportation, he won't place more thantwo cowbells into a single box. Since Kevin wishes to minimize expenses, he is curious about the smallest size box he can use to pack his entire collection.

Kevin is a meticulous cowbell collector and knows that the size of his i-th (1 ≤ i ≤ n) cowbell is an integersi. In fact, he keeps his cowbells sorted by size, sosi - 1 ≤ si for anyi > 1. Also an expert packer, Kevin can fit one or two cowbells into a box of sizes if and only if the sum of their sizes does not exceeds. Given this information, help Kevin determine the smallests for which it is possible to put all of his cowbells intok boxes of size s.


题意:

有k个盒子,n个物品,数据保证k《n;2k《n,每个盒子里可以放1或2个物品,最后所有箱子用统一的大小。求最小的箱子大小。


分析:利用优先队列的性质贪心。现在优先队列(大根堆)里填上k个0代表k个盒子。之后n此操作,每次取出一个盒子,如果是空的放入一个物品,标记最大值,如果不空再加入一个没放的最小的,记录最大值。最后结果即为最大值。

题解:
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <vector>#include <map>#include <string>#include <cstring>#include <functional>#include <cmath>#include <cctype>#include <cfloat>#include <climits>#include <complex>#include <deque>#include <list>#include <set>#include <utility>using namespace std;int s[100010];priority_queue<int,vector<int>,greater<int> > pq;int main(){//freopen("in.txt","r",stdin);int n,k;scanf("%d %d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",s+i);}int temp;int ans=0;for(int i=0;i<k;i++)pq.push(0);for(int i=n;i>0;i--){temp=pq.top();pq.pop();if(temp!=0)ans=max(ans,temp+s[i]);elsepq.push(s[i]);}while(!pq.empty()){temp=pq.top();pq.pop();}ans=max(ans,temp);printf("%d\n",ans);return 0;}

0 0