摘要:维持一个大小为K 的最大堆
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
using namespace std;
vector<pair<int, int> > command;
vector<pair<int, int> > heap;
int K = 0;
bool compareItem(pair<int, int> com1, pair<int, int> com2)
{
if(com1.first == com2.first){
return com1.second < com2.second;
}
return com1.first < com2.first;
}
void solve()
{
pair<int, int> first_com = *command.begin();
for(int i=1; i<=K; i++){
heap.push_back(make_pair(i * first_com.second, first_com.first));
}
make_heap(heap.begin(), heap.end(), compareItem);
for(vector<pair<int, int> >::iterator iter=command.begin()+1; iter!=command.end(); iter++){
for(int i=1; i<=K; i++){
int cost_time = iter->second * i;
if(cost_time > heap.begin()->first){
break;
}
pop_heap(heap.begin(), heap.end(), compareItem);
heap.erase(heap.end()-1);
heap.push_back(make_pair(cost_time, iter->first));
push_heap(heap.begin(), heap.end(), compareItem);
}
}
sort_heap(heap.begin(), heap.end(), compareItem);
for(int i=0; i<heap.size(); i++){
cout << heap.at(i).second << endl;
}
}
int main()
{
string buf;
while(cin >> buf){
if( buf == "#" ){
break;
}
int index;
int interval;
cin >> index >> interval;
command.push_back(make_pair(index, interval));
}
cin >> K;
solve();
return 0;
}