优先队列解贪心后悔类问题(HDU 1789、AcWing 145、洛谷 P4053)

HDU 1789:Doing Homework again

代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 1010;
int n;
bool st[N];

struct node
{
    int redu, ddl;
    bool operator< (const node& x)const {
        if (ddl == x.ddl) return redu > x.redu;
        return ddl < x.ddl;
    }
} nod[N];

struct nodeI
{
    int redu, ddl;
    bool operator< (const nodeI& x)const {
        return redu > x.redu;
    }
};


signed main()
{
    int T; cin >> T;

    while (T--)
    {
        memset(st, false, sizeof st);
        int sum = 0;
        cin >> n;
        for (int i = 1; i <= n; ++i)
        {
            int ddl; cin >> ddl;
            nod[i].ddl = ddl;
        }

        for (int i = 1; i <= n; ++i)
        {
            int redu; cin >> redu;
            nod[i].redu = redu;
            sum += redu;
        }

        sort(nod + 1, nod + n + 1);

        priority_queue<nodeI> heap;

        int day = 1, res = 0;

        for (int i = 1; i <= n; ++i)
        {
            int d = nod[i].ddl, r = nod[i].redu;
            if (day <= d)
            {
                heap.push({ r, d });
                res += r;
                ++day;
            }
            else if(day > d)
            {
                auto tmp = heap.top();
                int dd = tmp.ddl, rr = tmp.redu;
                if (rr < r)
                {
                    heap.pop(), res -= rr;
                    heap.push({ r, d }), res += r;
                }
                else continue;
            }
        }

        //cout << sum << ' ' << res << '\n';
        cout << sum - res << '\n';
    }


    return 0;
}

AcWing 145:超市

代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>

using namespace std;
#define int long long
const int N = 10010;
int n;
struct node
{
	int p, d;
	bool operator< (const node& x)const {
		if (d == x.d) return p > x.p;
		return d < x.d;
	}
} nod[N];

struct nd
{
	int val, time;
	bool operator< (const nd& x)const {
		return val > x.val;
	}
};

signed main()
{
	int T = 1; //cin >> T;

	while (T--)
	{
		while (cin >> n)
		{
			if (!n)
			{
				puts("0");
				continue;
			}

			for (int i = 1; i <= n; ++i) cin >> nod[i].p >> nod[i].d;
			sort(nod + 1, nod + n + 1);

			int day = 1;
			priority_queue<nd> heap;
			int res = 0;

			for (int i = 1; i <= n; ++i)
			{
				if (day <= nod[i].d) {
					heap.push({ nod[i].p, nod[i].d });
					res += nod[i].p;
					day++;
				}
				else {
					if (heap.size()){
						auto top = heap.top();
						if (top.val < nod[i].p) {
							res -= top.val;
							heap.pop();
							heap.push({ nod[i].p, nod[i].d });
							res += nod[i].p;
						}
					}
				}
			}

			cout << res << '\n';
		}
		
	}

	return 0;
}

洛谷 P4053 建筑抢修

代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>

using namespace std;
#define int long long
const int N = 1.5e5 + 10;
int n;
struct node
{
	int use;
	int ddl;
	bool operator< (const node& x)const {
		if (ddl == x.ddl) return use < x.use;
		return ddl < x.ddl;
	}
} nod[N];

struct nd
{
	int use;
	int ddl;
	bool operator< (const nd& x)const {
		return use < x.use;
	}
};

signed main()
{
	int T = 1; //cin >> T;

	while (T--)
	{
		cin >> n;
		for (int i = 1; i <= n; ++i)
		{
			scanf("%lld%lld", &nod[i].use, &nod[i].ddl);
		}

		sort(nod + 1, nod + n + 1);

		int time = 0, cnt = 0;
		priority_queue<nd> heap;

		for (int i = 1; i <= n; ++i)
		{
			time += nod[i].use;
			if (time <= nod[i].ddl)
			{
				++cnt;
				heap.push({ nod[i].use, nod[i].ddl });
			}
			else
			{
				time -= nod[i].use;
				if (heap.top().use > nod[i].use && heap.size())
				{
					auto t = heap.top(); heap.pop();
					time -= t.use;
					time += nod[i].use;
					heap.push({ nod[i].use, nod[i].ddl });
				}
			}
		}

		cout << cnt << '\n';
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值