摘要:维持一个大小为K的最小堆,这三个方法里这个时间最少。
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
const int com_size = 30000;
int interval[com_size+1] = {0};
int K = 0;
int com_num = 0;
typedef pair<int, int> command;
vector<command> heap;
bool compareItem(command one, command two)
{
if(one.first == two.first){
return one.second > two.second;
}
return one.first > two.first;
}
void solve()
{
make_heap(heap.begin(), heap.end(), compareItem);
while(K > 0){
pop_heap(heap.begin(),heap.end(), compareItem);
command current = *heap.rbegin();
heap.erase(heap.end()-1);
cout << current.second << endl;
heap.push_back(make_pair(current.first+interval[current.second], current.second));
push_heap(heap.begin(), heap.end(), compareItem);
K--;
}
}
int main()
{
string buf;
while(cin >> buf){
if( buf == "#" ){
break;
}
com_num++;
int com_index, inter;
cin >> com_index >> inter;
heap.push_back(make_pair(inter, com_index));
interval[com_index] = inter;
}
cin >> K;
solve();
return 0;
}