码迷,mamicode.com
首页 > 其他好文 > 详细

UVA1316 Supermarket

时间:2018-06-14 22:17:43      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:main   name   orange   online   输入输出格式   set   external   翻译   IV   

题目描述

有一个商店有许多批货,每一批货又有N(0<=N<= 10^4104 )个商品,同时每一样商品都有收益 P_iPi? ,和过期时间 D_iDi? (1<= Pi,DiPi,Di <= 10^4104 ),一旦超过了过期时间,商品就不能再卖。

你要做的就是求出每批货最多能得到多少收益。

输入输出格式

输入格式

多组数据,每组先给出一个整数N,表示这批货的商品个数。

然后有N对数,每对数有两个用空格隔开的正整数 P_i,D_iPi?,Di? ,表示第i个商品的收益和过期时间。相邻两对数之间用空格隔开。

输入以一个文件终止符结束,并且保证所有输入数据正确。

输出格式

对于每组数据,输出一行一个整数表示该批货物能卖出的最大价格。

感谢@Rye_Catcher 提供的翻译

题目描述

PDF

输入输出格式

输入格式:

 

输出格式:

 

输入输出样例

输入样例#1: 
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2 5 20 50 10
输出样例#1: 
80 
185

 

 

Solution:

  本题贪心。。。

  一个很简单的想法就是尽可能的让价值大的先卖,并且尽可能地在时间快要超过限制时卖(很显然,这样能给前面提供更多的选择)。

  但是这样的话是$n^2$的,多组数据有点虚。

  于是,我们换汤不换药,改成用堆去动态维护。

  先将物品按限制时间从小到大排序,再以价值为关键字建立小根堆,然后判断(设$tot$为堆中元素个数):

    1、若$t[i].d>tot$,说明当前只用了$tot$天,选$t[i]$不会过期,则直接将$t[i]$加入堆中。

    2、若$s[i].d==tot$,说明当前用了$tot$天,选$t[i]$恰好过期,所以与堆顶的元素价值比较,若堆顶价值$<t[i].p$则弹出堆顶将$t[i]$入堆,否则就不操作。

  最后输出堆中元素价值之和就好了。

代码:

 1 #include<bits/stdc++.h>
 2 #define il inline
 3 #define ll long long
 4 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
 5 #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
 6 #define Max(a,b) ((a)>(b)?(a):(b))
 7 #define Min(a,b) ((a)>(b)?(b):(a))
 8 using namespace std;
 9 const int N=100005,inf=233333333;
10 int n,m;
11 struct node{
12     int p,d;
13     bool operator <(const node &a) const {return p>a.p;}
14 }t[N];
15 priority_queue<node>q;
16 
17 il bool cmp(const node &a,const node &b){return a.d<b.d;}
18 
19 il int gi(){
20     int a=0;char x=getchar();bool f=0;
21     while((x<0||x>9)&&x!=-)x=getchar();
22     if(x==-)x=getchar(),f=1;
23     while(x>=0&&x<=9)a=(a<<3)+(a<<1)+x-48,x=getchar();
24     return f?-a:a;
25 }
26 
27 int main(){
28     while(scanf("%d",&n)==1){
29         For(i,1,n) t[i].p=gi(),t[i].d=gi();
30         sort(t+1,t+n+1,cmp);
31         int tot=0,ans=0;
32         For(i,1,n) 
33             if(t[i].d>tot)q.push(t[i]),tot++;
34             else if(t[i].d==tot) {
35                 if(t[i].p>q.top().p)q.pop(),q.push(t[i]);
36             }
37         while(tot--)ans+=q.top().p,q.pop();
38         printf("%d\n",ans);
39     }
40     return 0;
41 } 

 

UVA1316 Supermarket

标签:main   name   orange   online   输入输出格式   set   external   翻译   IV   

原文地址:https://www.cnblogs.com/five20/p/9185104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!