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 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.

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 long
11 #define INF 0x3f3f3f
12 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 }

BNUOJ 1575 Supermarket,布布扣,bubuko.com

时间: 2024-10-13 16:14:21

BNUOJ 1575 Supermarket的相关文章

bnuoj 17184 代数

bnuoj 17184 代数 题意: 现有N个未知数A[1],A[2],-A[N],以及M个方程,每个方程都是形如A[s]+A[s+1]+A[s+2]+-A[t-1]+A[t]=c.现在求解这个方程组. 限制: 1 <= n,m <= 1e5; 1 <= s,t <= N; 0 <= c < 1e9 思路: 带权并查集. 这道题想了好久没想通,最后才知道还可以用并查集做,涨知识了. 感谢http://blog.csdn.net/balloons2012/article/

BNUOJ 1206 A Plug for UNIX

A Plug for UNIX Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 108764-bit integer IO format: %lld      Java class name: Main You are in charge of setting up the press room for the inaugural meeting of the Un

BNUOJ 17286 Dollars

Dollars Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 14764-bit integer IO format: %lld      Java class name: Main New Zealand currency consists of $100, $50, $20, $10, and $5 notes and $2, $1, 50c, 20c, 1

矩阵快速幂——将运算推广到矩阵上HDU 1575

/* 本题的思路比较简单,就是将递推公式写出来,然后表达成为一个矩阵的形式 最后通过计算就可以得到一个符合题目要求的矩阵, 然后就是将矩阵上面所有的对角线元素相加 得到的结果即为所求的目标 */ #include<cstdio>  #include<cstring>  using namespace std;  const int maxn = 15;  #define mod 9973  int res[maxn][maxn];  int n;  void mul(int a[]

BNUOJ 34025 -Poor Warehouse Keeper(贪心)

题目:BNUOJ 34025 -Poor Warehouse Keeper(贪心) 题目大意:有一个商品的信息表,上面是数量,下面是总价,然后旁边各有一个按钮.上面的数量按钮按一下数量就加1,然后价格对应的也要在加上一个当前的单价.下面的按钮按一下的话,就对应的总价加1.初始状态是 1 1,然后给出终点状态,问能否得到.可以的话输出最少要按几次按钮,否则输出-1:总价每次输出都是下取整. 解题思路:如果想要尽快的得到总点状态的值,那么就应该按总价的按钮,因为只有总价变大了,商品对因的单价就上升了

BNUOJ 52325 Increasing or Decreasing 数位dp

传送门:BNUOJ 52325 Increasing or Decreasing题意:求[l,r]非递增和非递减序列的个数思路:数位dp,dp[pos][pre][status] pos:处理到第几位 pre:前一位是什么 status:是否有前导零 递增递减差不多思路,不过他们计算的过程中像5555,444 这样的重复串会多算,所以要剪掉.个数是(pos-1)*9+digit[最高位],比如一位重复子串是:1,2,3,4...9,9个,二位重复子串:11,22,33,44,...,99,9个:

POJ 1456 Supermarket 区间问题并查集||贪心

F - Supermarket Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1456 Appoint description:  System Crawler  (2015-11-30) Description A supermarket has a set Prod of products on sale. It earns a p

woj 1575 - Signal generators 单调队列优化dp + 瞎搞

戳这里:1575 题意:直线上排列着N个信号发射器,每个信号发射器被激活后将会使得影响范围内的所有发射器都被激活.询问激活任意一个发射器后被激活的发射器数最大是多少. 官方题解:可能会存在环的情况,考虑按坐标排序后i < j < k,j激活了k,然后k再激活i.但是这样可以转化为直接激活k的方案.所以无影响. 于是可以用dp求解.dp[i] = max( dp[j] + 1 ), position[j] + R[i] >= position[i],用单调队列优化时间复杂度为O(n). 向

BNUOJ 1260 Brackets Sequence

Brackets Sequence Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 114164-bit integer IO format: %lld      Java class name: Main Special Judge Let us define a regular brackets sequence in the following way: 1.