YACS2023年6月乙组

发布时间 2023-08-09 20:33:47作者: V_Melville

T1:两数归零

\(a_i + a_j = 0 \Leftrightarrow a_j = -a_i\),用 std::map<int, int> 来统计即可

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;

int main() {
    int n;
    cin >> n;
    
    vector<int> a(n);
    rep(i, n) cin >> a[i];
    
    ll ans = 0;
    map<int, int> mp;
    for (int x : a) {
        ans += mp[-x];
        mp[x]++;
    }
    
    cout << ans << '\n';
    
	return 0;
}

T2:牛奶供应(四)

\(x = p+(m-d_i)\)

显然每次应该优先购买 \(x\) 最小的那一次,这样就能保证 \(x\) 小的尽可能多买,\(x\) 大的尽可能少买
可以用 std::multiset 来维护

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;
using P = pair<int, int>;

int main() {
    int n, m, L;
    cin >> n >> m >> L;
    
    multiset<P> s;
    rep(i, n) {
        int d, w, p;
        cin >> d >> w >> p;
        p += m-d;
        s.emplace(p, w);
    }
    
    ll ans = 0;
    while (L) {
        auto [p, w] = *s.begin();
        if (L <= w) {
            ans += (ll)L*p;
            break;
        }
        else {
            ans += (ll)w*p;
            s.erase(s.begin());
            L -= w;
        }
    }
    
    cout << ans << '\n';
    
    return 0;
}