【题解】邮票

题目描述

  市面上总共有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;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10577591.html