HDU 4302 优先队列

#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
priority_queue<int, vector<int>, greater<int> >r;
priority_queue<int, vector<int>, less<int> >l;
int T, kase, n, L, t, cur, ans, num;
int main(int argc, char const *argv[])
{
	scanf("%d", &T);
	while (T--)
	{
		cur = ans = num = 0;
		scanf("%d%d", &L, &n);
		while (!r.empty()) r.pop();
		while (!l.empty()) l.pop();
		while (n--)
		{
			scanf("%d", &t);
			if (t && num) num--;
			else if (t && !(r.empty() && l.empty()))
			{
				int lpos = -INF, rpos = INF; num = 0;
				if (!r.empty()) rpos = r.top();
				if (!l.empty()) lpos = l.top();
				bool lr;
				if (l.empty()) lr = 1;
				else if (r.empty()) lr = 0;
				else if (cur - lpos > rpos - cur) lr = 1;
				else if (cur - lpos < rpos - cur) lr = 0;
				if (!lr)
				{
					if (l.empty()) while (1);
					ans += cur - lpos;
					cur = lpos; l.pop();
					while (!l.empty() && (l.top() == cur))
						num++, l.pop();
				}
				else
				{
					if (r.empty()) while (1);
					ans += rpos - cur;
					cur = rpos; r.pop();
					while (!r.empty() && (r.top() == cur))
						num++, r.pop();
				}
			}
			else if (!t)
			{
				scanf("%d", &t);
				if (t == cur) num++;
				else if (t > cur) r.push(t);
				else l.push(t);
			}
		}
		printf("Case %d: %d\n", ++kase, ans);
	}
	return 0;
}


用两个优先队列维护信息,蛋糕大于他当前所在位置的,用从小到大的优先级;蛋糕小于等于他当前所在位置,用从大到小的优先级。两个队列取出的元素再进行比较


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值