该题的归类是归并排序,我用的是STL中的MAP,算是MAP的运用吧;
题目衔接:http://poj.org/problem?id=2051
题目大意:有若干查询,每一个查询都有查询号和间隔时间,求从开始时刻的前K个查询的编号,我的做法是先将所有的查询都放在map中,每次取第一个pair,以及键值和第一个pai相同的pair,即同一时刻发生的所有查询,并将该查询的下一次查询时间加入map中,最后将所有查询按查询号排序,我利用的是SET,也可以用其它排序算法,AC代码如下:
#include <iostream>
#include <map>
#include <string>
#include <set>
using namespace std;
multimap<int,int> result; //<Q_period,Q_num>
map<int,int> query; //<Q_num,Q_period>
int main()
{
string str;
int k;
while(cin>>str && str != "#"){
int q_num,q_period;
cin>>q_num>>q_period;
result.insert(make_pair(q_period,q_num));
query.insert(make_pair(q_num,q_period));
}
cin>>k;
int count = 0;
multimap<int,int>::iterator map_it = result.begin();
while(count<k){
int temp = map_it->first;
set<int> store; //用于按查询号排序同一时刻发生的所有查询
while(temp == map_it->first){
int temp_num = map_it->second;
store.insert(temp_num);
result.erase(map_it);
result.insert(make_pair(temp+query[temp_num],temp_num));
map_it=result.begin();
}
set<int>::iterator set_it=store.begin();
while(count<k && set_it !=store.end()){
cout<<*set_it<<endl;
count++;
set_it++;
}
}
return 0;
}