问题描述
大家知道,在ACM基地每次算法专题学习学习优秀的成员是有奖励的,现在ACM基地主席小杜得到了教练给的一笔钱要去购买奖品。为了激发大家的学习积极性,给更多的成员颁发奖品,小杜想购买尽可能多的奖品发给大家。购买之前,小杜还向ACM基地成员征集了下奖品需求的情况,只要大家要求购买的就一定会买回来。当然每个奖品都需要花费一定的费用,当小杜的钱不够时就不能购买了。
现在,已知小杜得到的钱以及每个奖品的价格,请问小杜最多能购买多少个奖品?
输入第一行为一个整数T,表示有T种购买方案。
对于每组数据:
第一行是三个整数n, m, k,分别表示可供购买的奖品个数,成员要求购买的奖品个数,小杜身上的钱数(1≤m≤n≤10000, 1≤k≤10^9)。
第二行是n个整数,第i个整数xi表示第i个奖品的价格(1≤xi≤10^9)。
第三行是m个整数pi,表示成员要求购买的第pi个奖品(1≤pi≤n)。
如果小杜带的钱连成员要求的奖品都无法全部购买,请输出-1;否则,请输出小杜最多能购买的奖品数。每组输出占一行。
输入范例
2
5 2 10
4 3 8 1 12
1 2
5 2 10
4 3 8 1 12
1 3
输出范例
3
-1
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <limits> #include <algorithm> #include<vector> using namespace std; vector<long long> P; int main() { int t, n, m; int tmp; long long k; scanf("%d", &t); while (t--) { scanf("%d%d%lld", &n, &m, &k); for (int i = 1; i <= n; i++) {//所有可以买的商品 scanf("%I64d", &tmp); P.push_back(tmp); } long long sum = 0; for (int i = 0; i < m; i++) {//要求买的奖品 int t; scanf("%d", &t); sum += P[t-1]; P[t-1] = -1; } if (sum > k) {//不够钱 printf("-1\n"); } else if (sum == k) {//刚好够 printf("%d\n", m); } else {//还有钱,买买买 int cou = m; k -= sum; sort(P.begin(), P.end());//升序排序 for (int i = 0; i < n; i++) { if (P[i] != -1 && P[i] <= k) {//去掉已经购买的,买过的没货了,不能再买了 cou++; k -= P[i]; } if (k <= 0) break; } printf("%d\n", cou); } P.clear(); } return 0; }
成员的奖品
最新推荐文章于 2021-05-12 08:37:38 发布