【codeforces 762B】USB vs. PS/2

time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Due to the increase in the number of students of Berland State University it was decided to equip a new computer room. You were given the task of buying mouses, and you have to spend as little as possible. After all, the country is in crisis!

The computers bought for the room were different. Some of them had only USB ports, some — only PS/2 ports, and some had both options.

You have found a price list of a certain computer shop. In it, for m mouses it is specified the cost and the type of the port that is required to plug the mouse in (USB or PS/2). Each mouse from the list can be bought at most once.

You want to buy some set of mouses from the given price list in such a way so that you maximize the number of computers equipped with mouses (it is not guaranteed that you will be able to equip all of the computers), and in case of equality of this value you want to minimize the total cost of mouses you will buy.

Input
The first line contains three integers a, b and c (0 ≤ a, b, c ≤ 105) — the number of computers that only have USB ports, the number of computers, that only have PS/2 ports, and the number of computers, that have both options, respectively.

The next line contains one integer m (0 ≤ m ≤ 3·105) — the number of mouses in the price list.

The next m lines each describe another mouse. The i-th line contains first integer vali (1 ≤ vali ≤ 109) — the cost of the i-th mouse, then the type of port (USB or PS/2) that is required to plug the mouse in.

Output
Output two integers separated by space — the number of equipped computers and the total cost of the mouses you will buy.

Example
input
2 1 1
4
5 USB
6 PS/2
3 PS/2
7 PS/2
output
3 14
Note
In the first example you can buy the first three mouses. This way you will equip one of the computers that has only a USB port with a USB mouse, and the two PS/2 mouses you will plug into the computer with PS/2 port and the computer with both ports.

【题目链接】:http://codeforces.com/contest/762/problem/B

【题解】

/*
    贪心。
    对于两种类型的鼠标;
    混在一起;按照价格升序排;
    然后顺序枚举所有的鼠标;
    对于遇到的鼠标;
    (先遇到的鼠标一定要想法设法地把它买走,因为它肯定是比后面买的便宜)
        如果是A类型且a>0,那么a--;如果a==0但是c>0那么就用那个c来买它
            不然你那个c放在后面用的话,买到的鼠标肯定更贵!
        如果是B类型且b>0,那么b--;如果b==0但是c>0那么同理肯定也要用那个
            c来买它
        这里a--,b--的情况肯定是正确的,因为同一种鼠标,a和b都只能买特定
        的鼠标,你肯定先买便宜的嘛;
        不然你留着a和b干嘛?买更贵的鼠标?
        所以就优先使用a和b,而c则是在迫不得已的情况下再用;
    如果买不走就跳过.
    (原则就是,能买就买,因为前面都是最便宜的,最大限度地使每一个
     a,b,c买到最便宜的鼠标)
*/


【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define rei(x) scanf("%d",&x);
#define pb push_back
#define LL long long
#define se second
#define fi first

const string t1 = "USB";
const string t2 = "PS/2";
const int MAXN = 3e5+100;

int a,b,c,m,cnt = 0;
vector<pair <int,string> >dic;
LL ans = 0;

int main()
{
    //freopen("F:\rush.txt","r",stdin);
    rei(a);rei(b);rei(c);
    rei(m);
    for (int i = 1;i <= m;i++)
    {
        LL price;string type;
        cin >> price >> type;
        dic.pb({price,type});
    }
    sort(dic.begin(),dic.end());
    int len = dic.size();
    for (int i = 0;i <= len-1;i++)
    {
        if (a && dic[i].se==t1)
            a--;
        else
            if (b && dic[i].se == t2)
                b--;
            else
                if (c)
                    c--;
                else
                    continue;
        cnt++;
        ans+=dic[i].fi;
    }
    cout << cnt << ' '<<ans << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626685.html