POJ - 3190 贪心+优先队列

今天,吃饭,被SW教育了一波,堆是完全二叉树,堆是完全二叉树,堆是完全二叉树,重要的事情说三遍。

优先队列是堆,priority_queue——一个强大的STL,下面先介绍priority_queue的用法。

#include <iostream>
#include <queue>

using namespace std;

typedef struct Test
{
	int a;
	int b;
	bool operator < (const Test t) const    //重载“<”号——实现b小优先原则
	{
		return b > t.b;
	}
}Test;

priority_queue<Test> q;

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		Test buf;
		cin >> buf.a >> buf.b;
		q.push(buf);
	}

	while (!q.empty()) {
		cout << "(" << q.top().a << ", " << q.top().b << ")" << endl;
		q.pop();
	}
	return 0;
}

测试数据:
 

/*

input:

5
1 2
2 6
1 0
3 7
4 5

output:

(1, 0)
(1, 2)
(4, 5)
(2, 6)
(3, 7)

*/

 

关于本题:

#include <iostream>
#include <algorithm>
#include <queue>
#include <set>

using namespace std;

const int maxn = 50005;

typedef struct Test
{
	int a;
	int b;
	int n;
	int r;
	Test() {}
	Test(int aa, int bb, int nn, int rr)
	{
		a = aa;
		b = bb;
		n = nn;
		r = rr;
	}
	bool operator < (const Test &t) const
	{
		return b > t.b;
	}
}Test;

priority_queue<Test> q;
set< pair<int, int> > s;

bool cmp(const Test &t1, const Test &t2)
{
	if (t1.a == t2.a) return t1.b < t2.b;
	return t1.a < t2.a;
}

Test t[maxn];
int N;

int main()
{
	ios::sync_with_stdio(false);
    while (cin >> N && N) {

        for (int i = 0; i < N; i++) {
            cin >> t[i].a >> t[i].b;
            t[i].n = i + 1;
        }

        sort(t, t + N, cmp);

        int ans = 1;


        while (!q.empty()) q.pop();
        s.clear();

        q.push(Test(t[0].a, t[0].b, t[0].n ,t[0].r = 1));
        s.insert(make_pair(t[0].n, t[0].r));

        for (int i = 1; i < N; i++) {

            if (t[i].a > q.top().b)
            {
                //cout << "(" << t[i].n << ", " << q.top().n << ")" << endl;
                t[i].r = q.top().r;
                s.insert(make_pair(t[i].n, t[i].r));
                q.pop();
                q.push(Test(t[i].a, t[i].b, t[i].n, t[i].r));
            }
            else
            {
                ans++;
                t[i].r = ans;
                s.insert(make_pair(t[i].n, t[i].r));
                q.push(Test(t[i].a, t[i].b, t[i].n, t[i].r));
            }

        }
        cout << ans << endl;

        set< pair<int, int> >::iterator it = s.begin();
        while (it != s.end()) {
            cout << it->second << endl;
            it++;
        }
    }
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水能zai舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值