POJ2051 【STL heap的用法】

//POJ2051
//題目的大意是給定n個查詢請求,每個查詢請求有一個ID號,並以時間間隔爲m不停發送請求
//要計算前k個到達的請求,如果同一時刻有k個請求,按照id號從小到大排列
#include <cstdio>
#include <vector>
#include <algorithm>

struct Query
{
	int id;
	int period;
	int t;
};

bool cmp(const Query &lhs, const Query &rhs)
{
	return lhs.t > rhs.t || (lhs.t == rhs.t && lhs.id > rhs.id);
}

void Solve(int k, std::vector <Query> &queies)
{
	int lastPos = (int)queies.size() - 1;
	make_heap(queies.begin(), queies.end(), cmp);
	while (k-- > 0)
	{
		Query reachQ = queies.front();
		printf("%d/n", reachQ.id);
		pop_heap(queies.begin(), queies.end(), cmp);//只是移到末尾,未真正刪除
		queies[lastPos].t += queies[lastPos].period;
		push_heap(queies.begin(), queies.end(), cmp);
	}
}

int main()
{
	char s[100];
	int id, t;
	
	std::vector <Query> queies;
	queies.reserve(1000);
	Query q;
	q.t = 0;
	while (scanf("%s", s) && strcmp(s, "#") != 0)
	{
		scanf("%d %d", &q.id, &q.period);
		q.t = q.period;
		queies.push_back(q);
	}
	int k;
	scanf("%d", &k);
	Solve(k, queies);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章