题目大意

    一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该日期之前卖出可以获得收益,否则就无法卖出),且每种物品被卖出都有一个收益值Pi. 卖出每个物品需要耗时1天,且任一时刻只能卖出一个物品。给出这N种物品的Di和Pi,求最大收益值。

题目分析

    求最优值问题,可以考虑动态规划、贪心、搜索+剪枝等算法。尝试用贪心法来分析。

 
    由于需要选择集合S中收益最大的那个物品,因此使用优先队列进行维护。

实现(c++)

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<list>
#include<set>
#include<set>
#include<map>
#include<functional>
#include<algorithm>
using namespace std;
struct Node{
	int profit;
	int deadline;
	Node(int p=0, int d=0) :profit(p), deadline(d){};
};
Node gNodes[10005];
int solve(int n){
	int cur_day = gNodes[n - 1].deadline;
	int cur_product = n - 1;
	priority_queue<int> pq;
	int result = 0;
	while (cur_day && cur_product >= 0){
		while (cur_product >= 0 && gNodes[cur_product].deadline >= cur_day){
			pq.push(gNodes[cur_product].profit);
			cur_product--;
		}

		if (!pq.empty()){
			result += pq.top();
			pq.pop();
			cur_day--;
		}
		else{
			cur_day = gNodes[cur_product].deadline;
		}
	}
	while (cur_day && !pq.empty()){
		result += pq.top();
		pq.pop();
		cur_day--;
	}
	return result;
}

bool cmp(const Node& node1, const Node& node2){
	return node1.deadline < node2.deadline;
}
int main(){
	int n;
	while (scanf("%d", &n) != EOF){
		for (int i = 0; i < n; i++){
			scanf("%d %d", &gNodes[i].profit, &gNodes[i].deadline);
		}
		sort(gNodes, gNodes + n, cmp);
		int result = solve(n);
		printf("%d\n", result);
	}
	return 0;
}

 

相关文章:

  • 2021-09-26
  • 2020-02-04
  • 2021-10-31
  • 2021-05-25
  • 2021-12-03
  • 2021-08-02
猜你喜欢
  • 2021-08-19
  • 2021-08-25
相关资源
相似解决方案