NC15911. 最小化价格
描述
输入描述
第一行n,m
第二行n个数,表示每组的人数
接下来m行,每行两个数,表示可容纳的最大人数和选择的价格
输出描述
输出最小化选择的价格,无解输出-1
示例1
输入:
3 4 2 3 4 1 2 2 3 3 4 4 5
输出:
12
C++14(g++5.4) 解法, 执行用时: 157ms, 内存消耗: 1764K, 提交时间: 2020-04-19 23:46:20
#include<bits/stdc++.h> using namespace std; int main(){ int n,m;cin>>n>>m; vector<int> a(n); for(int i=0;i<n;i++) cin>>a[i]; sort(a.begin(),a.end(),greater<int>()); pair<int,int> q[m]; for(int i=0;i<m;i++) cin>>q[i].first>>q[i].second; sort(q,q+m); long long sum=0; int now=m-1; priority_queue<int> que; for(int i=0;i<n;i++){ while(~now && q[now].first>=a[i]) que.push(-q[now].second),now--; if(que.empty()) return puts("-1"),0; sum-=que.top(); que.pop(); } cout<<sum<<endl; return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 133ms, 内存消耗: 3596K, 提交时间: 2023-03-27 11:09:01
#include <bits/stdc++.h> using namespace std; int main() { int n, m, x; cin >> n >> m; multiset<int>s; for (int i = 0; i < n; i++) { cin >> x; s.insert(x); } vector<pair<int, int>>b(m); for (int i = 0; i < m; i++) { cin >> b[i].second >> b[i].first; } sort(b.begin(), b.end()); long long ans = 0; for (int i = 0; i < m; i++) { auto it = s.upper_bound(b[i].second); if (it != s.begin()) { s.erase(--it); ans += b[i].first; } } if (s.size()) ans = -1; cout << ans; }