JZOJ5461 购物
Description
X 城的商场中,有着琳琅满目的各种商品。一日,小X 带着小Y 前来购物,小Y 一共看中了n件商品,每一件商品价格为Pi。小X 现在手中共有m个单位的现金,以及k 张优惠券。小X 可以在购买某件商品时,使用至多一张优惠券,若如此做,该商品的价格会下降至Qi。
小X 希望尽可能多地满足小Y 的愿望,所以小X 想要知道他至多能购买多少件商品。
小X 希望尽可能多地满足小Y 的愿望,所以小X 想要知道他至多能购买多少件商品。
Input
第一行包含三个整数n,k,m,表示商品总数,小X 拥有的优惠券与现金总数。
接下来n行每行包含两个整数Pi,Qi。
接下来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 }