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;
}