JZOJ5461 购物

Description

  X 城的商场中,有着琳琅满目的各种商品。一日,小X 带着小Y 前来购物,小Y 一共看中了n件商品,每一件商品价格为Pi。小X 现在手中共有m个单位的现金,以及k 张优惠券。小X 可以在购买某件商品时,使用至多一张优惠券,若如此做,该商品的价格会下降至Qi。
  小X 希望尽可能多地满足小Y 的愿望,所以小X 想要知道他至多能购买多少件商品。

Input

  第一行包含三个整数n,k,m,表示商品总数,小X 拥有的优惠券与现金总数。
  接下来n行每行包含两个整数Pi,Qi。

Output

  共一行包含一个整数,表示小X 至多能购买的物品数。

Sample Input

  4 1 7
  3 2
  2 2
  8 1
  4 3

Sample Output

  3
  样例解释:一种最优的购买方式是购买1,2,3号物品,并用优惠券购买物品3,总共花费为3+2+1=6。

Data Constraint

Solution

  可撤销贪心,先把优惠券用于优惠价最小的k件物品中,将差价放入队列,意味着再付差额的价钱可获得一张优惠券。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<queue>
 4 using namespace std;
 5 priority_queue<long long> d;
 6 struct arr
 7 {
 8     int x;
 9     long long y;
10 }p[70000],q[70000];
11 int n,k,ans;
12 long long m,w[70000];
13 bool f[70000];
14 bool cmp1(arr a,arr b)
15 {
16     return a.y<b.y;
17 }
18 bool cmp2(arr a,arr b)
19 {
20     return a.y>b.y;
21 }
22 int main()
23 {
24     scanf("%d%d%lld",&n,&k,&m);
25     for (int i=1;i<=n;i++)
26     {
27         scanf("%d%d",&p[i].y,&q[i].y);
28         p[i].x=i;
29         q[i].x=i;
30         w[i]=p[i].y;
31         f[i]=true;
32     }
33     sort(p+1,p+n+1,cmp1);
34     sort(q+1,q+n+1,cmp1);
35     int l=1,r=1;
36     for (int i=1;i<=k;i++)
37         if (q[i].y<=m)
38         {
39             m=m-q[i].y;
40             ans++;
41             l=i+1;
42             d.push(-w[q[i].x]+q[i].y);
43             f[q[i].x]=false;
44         }
45     if (l!=1)
46     for (int i=1;i<=n;i++)
47     {
48         while (f[p[r].x]==false&&r<=n) r++;
49         if (m<p[r].y&&m<-d.top()+q[l].y||ans==n)
50             break;
51         if (p[r].y<-d.top()+q[l].y)
52         {
53             f[p[r].x]=false;
54             m=m-p[r++].y;
55         }
56         else
57         {
58             f[q[l].x]=false;
59             m=m+d.top()-q[l].y;
60             d.pop();
61             l++;
62             d.push(-w[q[l].x]+q[l].y);
63         }
64         ans++;
65     }
66     printf("%d",ans);
67 }
View Code

 

 
posted @ 2018-08-14 20:39  kasiruto  阅读(115)  评论(0编辑  收藏