POJ 1456

由于这道题设置,一件商品的售出需要一天,因此倘若考虑用一个结构记录当前打算售出的件数,这和结构中记录元素数量是一致的。

这道题比较巧妙的是比贪心更近一步,使用最小堆进行优化

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <deque>
using namespace std;

const int maxn= 1e4+5;

struct Prod
{
	int p, d;
	Prod (int _p= 0, int _d= 0) : p(_p), d(_d) {}
	bool operator < (const Prod &rhs) const
	{
		return p> rhs.p;
	}
}pdt[maxn];
priority_queue<Prod> hp;

bool cmp (const Prod &lhs, const Prod &rhs)
{
	return lhs.d < rhs.d;
}

int main(int argc, char const *argv[])
{
	int n;
	while (~scanf("%d", &n)){
		while (!hp.empty()){
			hp.pop();
		}
		for (int i= 0; i< n; ++i){
			scanf("%d %d", &pdt[i].p, &pdt[i].d);
		}
		sort(pdt, pdt+n, cmp);

		for (int i= 0; i< n; ++i){
			if (pdt[i].d > (int)(hp.size())){
				hp.push(pdt[i]);
			}
			else if ((int)(hp.size())== pdt[i].d){
				Prod can= hp.top();
				if (can.p < pdt[i].p){
					hp.pop();
					hp.push(pdt[i]);
				}
			}
		}

		int ans= 0;
		while (!hp.empty()){
			Prod cur= hp.top();
			hp.pop();
			ans+= cur.p;
		}

		printf("%d\n", ans);
	}	
	return 0;
}
posted @ 2021-06-11 22:13  IdiotNe  阅读(34)  评论(0编辑  收藏  举报