Supermarket
时间限制:1000 ms | 内存限制:65535 KB
难度:4
- 描述
-
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.
- 输入
- 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.
- 输出
- 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.
- 样例输入
-
4 50 2 10 1 20 2 30 1 7 20 1 2 1 10 3 100 2 8 2 5 20 50 10
- 样例输出
-
80 185
1 /** 2 题目大意: 3 求:能够得到的最大利润 4 数据说明: 5 n ==> 表示有n种商品 6 px dx ==> 只要商品在dx (包括dx)之前买完就可以获得px的利润 7 一天只可以买一种商品 8 9 步骤(贪心): 10 ①、将px降序排列 11 ②、每件商品从最大期限的时间的开始查找直到找到可以使用的时间 (或者到第一天) 12 ②(1)如果是找到满足条件的时间就将该件商品的px加入能够得到的总利润中(然后跳出循环) 13 ②(2)如果是找不到就不将该商品的px加入到总利润中 14 **/
核心代码:
1 sort (P, P+n, cmp); 2 3 for (int i = 0; i < n; ++ i) 4 { 5 for (int j = P[i].dx; j >= 1; -- j) 6 { 7 if (!book [i]) 8 { 9 book [i] = 1; 10 cnt += P[i].px; 11 break; 12 } 13 } 14 }
C/C++代码实现(AC):
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #include<iostream> 6 7 using namespace std; 8 9 int n, cnt, flag[100*105]; 10 11 struct node 12 { 13 int v, k; 14 }P[100*105]; 15 16 bool cmp(node a, node b) 17 { 18 return a.v > b.v; 19 } 20 21 int main(){ 22 while(~scanf("%d", &n)) 23 { 24 cnt = 0; 25 memset(flag, 0, sizeof(flag)); 26 for(int i = 0; i < n; ++ i) 27 scanf("%d%d", &P[i].v, &P[i].k); 28 sort(P, P + n, cmp); 29 for(int i = 0; i < n; ++ i) 30 { 31 for(int j = P[i].k; j >= 1; -- j) 32 { 33 if (!flag[j]) 34 { 35 flag[j] = 1; 36 cnt += P[i].v; 37 break; 38 } 39 } 40 } 41 printf("%d ", cnt); 42 } 43 return 0; 44 }