列表

详情


NC15911. 最小化价格

描述

现有n组人,m个地点,给出每组人的人数,每个地点可容纳的最大人数和选择的价格
要求一种方式,使得每组人都到一个各不相同的地点,最小化选择的价格
每个队伍的人都要在同一个地方每个地方只能有一个队伍

输入描述

第一行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;
}

上一题