列表

详情


NC217445. 溪染的优惠券

描述

溪染在日参加了某宝的福利活动

她得到了张优惠券

每张优惠券可以对任意商品生效

每张优惠券有个参数,

代表满元可以减免元(保证大于等于

溪染在想买一个商品,商品需要

可惜溪染是个穷鬼,只能依靠优惠券过活

于是她去查看了优惠券使用方法,如下:
优惠券只能一张一张按顺序使用,且每张优惠券只能使用一次

对于一个商品,和一张优惠券编号为,如果商品价格为元且大于等于a_i元,那么使用优惠券后商品价格可以减少b_i元,此时商品价格更新为(k-b_i)

如果需要使用下一张优惠券编号为,那么必须满足,此时商品价格更新为(k-b_i-b_j)元,以此类推

溪染想要知道她最少支付多少软妹子才能买到商品
于是她找到了你,希望你帮她计算一下

输入描述

第一行输入两个正整数,表示优惠券的张数和商品价格。
接下来输入n行,每行两个非负整数,含义见上文。

输出描述

仅一行表示问题的答案,最少需要支付多少钱。

示例1

输入:

5 100
42 24
82 4
95 17
84 48
77 43

输出:

24

说明:

优惠券使用顺序为:
使用2号优惠券,商品更新为96元
使用4号优惠券,商品更新为48元
使用1号优惠券,商品更新为24元

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 8ms, 内存消耗: 432K, 提交时间: 2021-06-18 21:32:51

#include<bits/stdc++.h>
using namespace std;
int n,k,dp[10005];
struct node{
	int a,b;
}x[1005];
bool cmp(node q,node p){
	return q.a-q.b<p.a-p.b;
}
int main(){
	scanf("%d %d",&n,&k);
	for(int i=1;i<=n;i++) scanf("%d %d",&x[i].a,&x[i].b);
	sort(x+1,x+1+n,cmp);
	for(int i=1;i<=n;i++)
		for(int j=k;j>=x[i].a;j--)
			dp[j]=max(dp[j],dp[j-x[i].b]+x[i].b);
	printf("%d",k-dp[k]);
	return 0;
}

Python3 解法, 执行用时: 1572ms, 内存消耗: 4808K, 提交时间: 2022-10-26 11:19:09

n, k = (map(int, input().split()))
arr = []
for i in range(n):
    arr.append( tuple(map(int, input().split())) )

arr.sort(key=lambda x: x[0] - x[1], reverse=True)

f = [0 for _ in range(10005)]
f[k] = 1
for i in range(n):
    for j in range(arr[i][0], k + 1):
        f[j-arr[i][1]] |= f[j]
res  = 1
while not f[res]:
    res+=1
print(res)

pypy3 解法, 执行用时: 125ms, 内存消耗: 20840K, 提交时间: 2021-06-20 10:19:58

n, k = (map(int, input().split()))
arr = []
for i in range(n):
    arr.append(list(map(int, input().split())))

arr.sort(key=lambda x: x[0] - x[1], reverse=True)

f = [0] * 100005
f[k] = 1
for i in range(n):
    for j in range(arr[i][0], k + 1):
        f[j-arr[i][1]] |= f[j]
res  = 1
while not f[res]:res+=1
print(res)

上一题