贪心 B - BnPC 组队赛补题


题目

题意

给你n个单词并且他们给出他们的能力,然后让他们的能力>=后面的能力,给你k让你增加

分析

首先先让他们达到0,在进行贪心,如果他的带来的价值大于组数带来的价值,肯定是最优的,否则就用价值最大的

代码

#include 
using namespace std;
typedef long long ll;
typedef pairPII;
const int N = 1e5 + 50;

ll n, k;
map sct;
int points[N], num[N];
int co[N];
ll Cont[N];
bool vis[N];
PII a[N];
signed main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);

    ios::sync_with_stdio(false);

    cin >> n >> k;

    for (int i = 1; i <= n; i++) {
        string s;
        int t;
        cin >> s >> t;
        sct[s] = i;
        points[i] = t;
    }

    int l;
    cin >> l;

    for(int i=1;i<=l;i++) {
        string s;
        int t;
        cin >> s >> t;
        int x = sct[s];
        num[x]++;
        a[i]={x,t};
        if (points[x] <= t) {
            k -= t - points[x];
            points[x] = t;
        }
    }

    if (k < 0) {
        cout << 0 << endl;
        return 0;
    }

    ll res = 0;
    int max_num = 0;
    for (int i = 1; i <= n; i++) {
        max_num = max(max_num, num[i]);
    }
    for(int i=1;i<=l;i++)
    {
        int xx=a[i].first,yy=a[i].second;
        if(yy());

    for (int i = 1; i <= n; i++) {
        if (Cont[i] < max_num) break;
        if (k) {
            res += Cont[i];
            k--;
        } else
            break;
    }

    if (k) {
        res += (ll)k * max_num;
    }

    cout << res << endl;

    return 0;
}