NC217445. 溪染的优惠券
描述
溪染在月日参加了某宝的福利活动
她得到了张优惠券
每张优惠券可以对任意商品生效
每张优惠券有个参数,和
代表满元可以减免元(保证大于等于)
溪染在月日想买一个商品,商品需要元
可惜溪染是个穷鬼,只能依靠优惠券过活
对于一个商品,和一张优惠券编号为,如果商品价格为元且大于等于元,那么使用优惠券后商品价格可以减少元,此时商品价格更新为元
如果需要使用下一张优惠券编号为,那么必须满足,此时商品价格更新为元,以此类推
输入描述
第一行输入两个正整数,表示优惠券的张数和商品价格。接下来输入n行,每行两个非负整数,含义见上文。
输出描述
仅一行表示问题的答案,最少需要支付多少钱。
示例1
输入:
5 100 42 24 82 4 95 17 84 48 77 43
输出:
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)