题目描述
市面上总共有N张不同的邮票,编号0至N-1。第i张邮票的价格是p[i]。你的目标是能收集尽量多的不同邮票。如果你有足够多的钱,那显然不是问题,全部买回来就行了。但是你手头上一分钱也没钱,幸运的是一开始你手头上已经有m张邮票了,这些邮票的编号保存在数组b[i],0 < = i < m。于是你决定通过卖掉你手头上的某些邮票,再买进一些其他的邮票,通过这样卖出买进,你最后最多可以有几张邮票(当然你也可以不做任何买卖)?注意:对于任意的0 <= j < N, 如果你卖出邮票j,那么你可以得到p[j]金钱,如果你想买进邮票j,那么你得付p[j]金钱。
输入输出格式
输入格式
第一行,一个整数N,表示有N张邮票。1<=N<=50。
第二行, N个整数,第i个整数表示p[i],1<=p[i]<=1000000。
第三行,一个整数m,表示你现在已经有了m张邮票。0<=m<=n.
第四行, m个整数,第i个整数表示b[i]。
输出格式
一个整数,通过买卖,你最多可以有几张邮票?
输入输出样例
输入样例
5
4 13 9 1 5
3
1 3 2
输出样例
4
题解
把所有已有的邮票卖了,然后尽可能买便宜的邮票就行了。
#include <iostream> #include <algorithm> #define MAX_N (50 + 5) using namespace std; int n; int a[MAX_N]; int m; int b[MAX_N]; int cnt, ans; inline bool cmp(int x, int y) { return a[x] < a[y]; } int main() { cin >> n; for(register int i = 0; i < n; ++i) { cin >> a[i]; b[i] = i; } sort(b, b + n, cmp); cin >> m; int tmp; for(register int i = 0; i < m; ++i) { cin >> tmp; cnt += a[tmp]; } for(register int i = 0; i < n && a[b[i]] <= cnt; ++i) { ++ans; cnt -= a[b[i]]; } cout << ans; return 0; }