首页 > 代码库 > BNUOJ 1575 Supermarket

BNUOJ 1575 Supermarket

Supermarket

Time Limit: 2000ms
Memory Limit: 65536KB
This problem will be judged on PKU. Original ID: 1456
64-bit integer IO format: %lld      Java class name: Main
 
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 17  20 1   2 1   10 3  100 2   8 2   5 20  50 10

Sample Output

80185

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.
 

Source

Southeastern Europe 2003
 
解题:优先队列+贪心。想想有N件物品,如果每件物品的截止日期都比N都大,那么是不是把这N件物品全部都加起来是不是一定是最大的?好,有一些截止日期少于N的物品,假设截止日期少于N
的物品的截止日期各不相同,还是全部加起来,解最优。为什么?因为没有冲突,这些日期是递增的,刚好可以对应这N天。如果有重复的呢?我们先对物品排序,第一关键字是日期,第二关键字是价值,日期是小到大,价值大到小。如果没有重复的日期,那么N个物品N天,一定一天可以对应某一件,现在有重复的,日期又是重小到大排列的。假设第k天,出现p[i]的截止日期刚好等于k,如果p[i]的截止日期大于k,那肯定选啊,不会过保质期啊,如果等于k呢,这件物品一定可以替换k天内的物品,在不一定最优解的情况下,为什么呢?因为不会过期!假设前面k天价值最小的物品价值比p[i]的物品价值还小,用p[i]去替换这件物品,一定可以使价值和变大,更优。所有的更优最后变成最优了。
 
 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #include <queue>10 #define LL long long11 #define INF 0x3f3f3f12 using namespace std;13 struct node {14     int px,dx;15 } p[10010];16 bool cmp(const node &x,const node &y) {17     return (x.dx < y.dx || x.dx == y.dx&&x.px > y.px);18 }19 priority_queue<int,vector<int>,greater<int> >q;20 int main() {21     int n,i,j;22     while(~scanf("%d",&n)) {23         for(i = 0; i < n; i++)24             scanf("%d %d",&p[i].px,&p[i].dx);25         sort(p,p+n,cmp);26         while(!q.empty()) q.pop();27         LL ans = 0;28         for(i = 0; i < n; i++) {29             if(q.size() == p[i].dx) {30                 if(q.top() < p[i].px) {31                     ans += p[i].px - q.top();32                     q.pop();33                     q.push(p[i].px);34                 }35             } else {36                 q.push(p[i].px);37                 ans += p[i].px;38             }39         }40         printf("%lld\n",ans);41     }42     return 0;43 }
View Code