POJ 1456 Supermarket

A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral number of time units starting from the moment the sale begins. Each product takes precisely one unit of time for being sold. A selling schedule is an ordered subset of products Sell ≤ Prod such that the selling of each product x∈Sell, according to the ordering of Sell, completes before the deadline dx or just when dx expires. The profit of the selling schedule is Profit(Sell)=Σ  x∈Sellpx. An optimal selling schedule is a schedule with a maximum profit. 
For example, consider the products Prod={a,b,c,d} with (pa,da)=(50,2), (pb,db)=(10,1), (pc,dc)=(20,2), and (pd,dd)=(30,1). The possible selling schedules are listed in table 1. For instance, the schedule Sell={d,a} shows that the selling of product d starts at time 0 and ends at time 1, while the selling of product a starts at time 1 and ends at time 2. Each of these products is sold by its deadline. Sell is the optimal schedule and its profit is 80. 

Write a program that reads sets of products from an input text file and computes the profit of an optimal selling schedule for each set of products. 
Input
A set of products starts with an integer 0 <= n <= 10000, which is the number of products in the set, and continues with n pairs pi di of integers, 1 <= pi <= 10000 and 1 <= di <= 10000, that designate the profit and the selling deadline of the i-th product. White spaces can occur freely in input. Input data terminate with an end of file and are guaranteed correct.
Output
For each set of products, the program prints on the standard output the profit of an optimal selling schedule for the set. Each result is printed from the beginning of a separate line.
Sample Input
4  50 2  10 1   20 2   30 1

7  20 1   2 1   10 3  100 2   8 2
   5 20  50 10
Sample Output
80
185
Hint
The sample input contains two product sets. The first set encodes the products from table 1. The second set is for 7 products. The profit of an optimal schedule for these products is 185.


题意:有n个商品,商品有规定,只有在规定的时间之前卖出,才会有收入,一天只能卖一个商品。问最多会有多少收入。对于样例一:第一天卖收益为30的商品,第二天卖收益为50的商品。对于样例二:依旧卖出的商品是20,100,10,50,5,总共185。

一开始错了三发,第一次因为没有读懂题意,根据样例直接写了,果然错了,然后好好写,可是还受第一次的思想干扰,又重新翻译了一下才发现错误。比如接下来这组样例:
5  10 1  20 1  30 3  40 3  40 3,如果从第一天开始贪心:第一天是20,第二天是40,第三天是40,总共100,可是结果不是这样的,结果是40,40,30,总共110。所以时间应该从后往前枚举,每次取出此时可以销售物品的最大值。比如接下来这组样例:8  10 1, 20 2, 40 8, 40 8, 30 8,30 5,35 10, 40 10.
经过排序之后是:10 1,20 2,30 5,40 8,40 8,30 8,35 10,40 10。从后往前枚举时间
时间10987654321
收益(40 10)(35 10)(40 8)(40 8)(30 8)(30 5)(0 0)(0 0)(20 2)(10 1)
最后结果就是245,为了方便用优先队列(并查集也可以写,只不过没有优先队列快),每次弹出压入队列的最大值即可。
#include <queue>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
	int p, d;
}s[10005];

bool cmp(node x, node y) {
	return x.d>y.d;
}
priority_queue<int, vector<int>, less<int> >q;
int main() {
	int n;
	while(~scanf("%d", &n)) {
		int mx = 0;
		for(int i = 0; i < n; i++) {
			scanf("%d %d", &s[i].p, &s[i].d);
		}
		sort(s, s+n, cmp);
		int sum = 0, p = 0;
		while(!q.empty()) q.pop();
		for(int i = s[0].d; i >= 1; i--) {
			while(p < n && s[p].d >= i) {
				q.push(s[p++].p);
			}
			if(!q.empty()) {
				printf("%d\n",q.top());
				sum += q.top();
				q.pop();
			}
		}
		printf("%d\n", sum);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值