常州买衣服

题目描述
不知道是拔河训练的作用还是那个梦的缘故,反正小X是一天天瘦下来了,虽然还没有中天学长那么帅,但比起 Q 老师已经瘦了很多,小X原先买的衣服都嫌大了,于是他想去买些新衣服,小X的衣服原先一直是在非主流服装店买的,他的衣服一般店里是买不到的,而去非主流服装店肯定能买到,如膝盖上挖了两个洞的牛仔裤,正常人穿了像雨衣的冲锋衣等应有尽有,并且每买一件就送一张优惠券,小X这些年下来积聚了好多张优惠券,这次非主流服装店恰好举行优惠活动,用优惠券购买衣服可享受优惠价!
小X来到了非主流服装店,他看上了 n 件衣服,每一件衣服价格为 Pi,小X现在手中共有 m 个单位的现金,以及 k 张优惠卷。小X可以在购买某件衣服时,使用至多一张优惠券,若使用优惠券,则该衣服的价格会下降至 Qi,小X想知道他最多可以买几件衣服。

输入
第一行包含三个用空格隔开的正整数 n,k,m,依次表示衣服总数和优惠券数量及现金总数。
接下来 n 行每行包含两个整数 Pi,Qi,表示该件衣服的价格和优惠价。数据保证 Pi>=Qi。

输出
输出数据仅有一行包含一个整数,表示小 X 最多能购买的衣服数。

样例输入

4 1 7
3 2
2 2
8 1
4 3
样例输出
3

提示
30%的数据,n<=5,k=1,m<=100
对于另外 10%的数据,n<=5,k<=5,m<=100
60%的数据,n<=200,k<=200
80%的数据,n<=2500,k<=2500
100%的数据,n<=50000,k<=50000,m<=10^16

#include <iostream>
#include <algorithm>
using namespace std;
struct str
{
	int b;
	int c;
}a[100005];
bool cmp1(str p,str q)
{
	return p.c<q.c;
}
bool cmp2(str p,str q)
{
	return p.b<q.b;
}
int main()
{
	int n,k,m,t=0;
	cin>>n>>k>>m;
	for(int i=0;i<n;i++){
		scanf("%d %d",&a[i].b,&a[i].c);
	}
	sort(a,a+n,cmp1);
	for(int i=0;i<k;i++){
		if(m-a[i].c<0)
			break;
		a[i].b=1e+09;
		m=m-a[i].c;
		t++;
		if(m==0) break;
	}
	sort(a,a+n,cmp2);
	for(int i=0;i<n;i++){
		if(m-a[i].b<0)
			break;
		m=m-a[i].b;
		t++;
		if(m==0) break;
	}
	printf("%d\n",t);
	return 0;
}
/*
先按优惠后价格从小到大排,
买完优惠卷的后,
再按优惠前价格从小到大排,
直到钱花没了或者买不起下一件为止,
注意优惠后的买完以后把数组中的数变得足够大,
防止后面再买一次。
*/

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/85256399