G - Supermarket(贪心+并查集)

来源:vjudge [kuangbin带你飞] 专题5 并查集

G - Supermarket

链接:https://vjudge.net/contest/320571#problem/G

题目描述:

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. 

Time limit

2000 ms

Memory limit

65536 kB

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

题意:

给你一批商品的出售利润和最迟出售日期,每天只能买一个商品,请你求出最大利润。

 

分析:

这个题之前好像在atcoder上遇到过一样的,那个时候不会做。这次碰到了还是不会。通过csdn找到了这个做法。首先是贪心,根据最大利润进行排序,相同的时候根据时间排序。接下来初始化日期的并查集,日期为x的商品还剩下几天可以卖。接下来遍历排序后的结构体,每次查看并查集保质期为d的商品是否还有时间可以出售,如果还有就记录。

 

代码:

#include
#include
#include 
using namespace std;
const int M=1e4+10;
typedef struct{
	int p,d;
}pro;
int a[M];
bool cmp(pro a,pro b){	//贪心排序 
	if(a.p==b.p){	//如果日期利润,则根据保质期长短来比较 
		return a.db.p;
}
void init_set(){	//初始化并查集,保质期为d的商品还剩几天可以卖 
	for(int i=1;i

你可能感兴趣的:(G - Supermarket(贪心+并查集))