POJ Argus

该题的归类是归并排序,我用的是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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值