Yogurt factory POJ 2393(贪心 优先队列)

原题

题目链接

题目分析

简单贪心题,从第一周开始,每过一周就把当周酸奶的生产价格加入优先队列中,不过由于存储要钱,所以加入优先队列需要一点额外操作.想一下当i周时,第一周生产的酸奶加上存储成本c1=c1+s*(i-1),第二周生产的酸奶同理,c2=c2+s*(i-2)...我们要从中选处理后价格最小的,由于这是相对的,我们可以对每个酸奶的成本减去一个s*i,则处理后为 c1=c1-s,c2=c2-2*s,c3=c3-3*s,同样最小的那个酸奶即为最后解,因此每次加入优先队列,加入的值是c-s*i,而取出来的值只需要加回s*i就可以还原原来的价格了.

代码

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <utility>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <cstring>
 7 #include <string>
 8 #include <vector>
 9 #include <stack>
10 #include <queue>
11 #include <map>
12 #include <set> 
13 
14 using namespace std;
15 typedef long long LL;
16 const int INF_INT=0x3f3f3f3f;
17 const LL INF_LL=0x3f3f3f3f3f3f3f3f; 
18 
19 int main()
20 {
21 //    freopen("black.in","r",stdin);
22 //    freopen("black.out","w",stdout);
23     LL n,s;
24     cin>>n>>s;
25     LL sum=0;
26     priority_queue<LL,vector<LL>,greater<LL> > que; 
27     for(int i=0;i<n;i++)
28     {
29         LL c,y;
30         scanf("%lld %lld",&c,&y);
31         que.push(c-s*i);
32         LL p=que.top();
33         sum+=y*(p+i*s);
34     }
35     printf("%lld\n",sum);
36     return 0;
37 } 

 

posted @ 2019-08-23 17:58  VBL  阅读(163)  评论(0编辑  收藏  举报