题目描述:
现有n组人,m个地点,给出每组人的人数,每个地点可容纳的最大人数和选择的价格 要求一种方式,使得每组人都到一个各不相同的地点,最小化选择的价格 每个队伍的人都要在同一个地方每个地方只能有一个队伍
输入描述:
第一行n,m
第二行n个数,表示每组的人数
接下来m行,每行两个数,表示可容纳的最大人数和选择的价格
第二行n个数,表示每组的人数
接下来m行,每行两个数,表示可容纳的最大人数和选择的价格
所有数据小于1e5
输出描述:
输出最小化选择的价格,无解输出-1
示例1
输入
3 4
2 3 4
1 2
2 3
3 4
4 5
2 3 4
1 2
2 3
3 4
4 5
输出
12
解题思路
:尽量去价格便宜的景点,景点容纳量尽可能和队伍人数匹配,匹配不到则找到和景点人数相差最小的队伍放入。
#include<bits/stdc++.h>
using namespace std;
struct Node{
int num;
int price;
};
bool cmp_price(Node a,Node b){
return a.price<b.price;
}
vector<int> a;
Node b[100005];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
int jj;
scanf("%d",&jj);
a.push_back(jj);
}
for(int i=0;i<m;i++){
scanf("%d%d",&b[i].num,&b[i].price);
}
sort(a.begin(),a.end());;
sort(b,b+m,cmp_price);
int pos=0;
int sum_price=0;
int cnt=0;
for(int i=0;i<m;i++){
vector<int>::iterator it=upper_bound(a.begin(),a.end(),b[i].num);
if(it!=a.begin()){
sum_price+=b[i].price;
a.erase(it-1);
cnt++;
}
}
if(cnt!=n)
cout<<-1<<endl;
else
cout<<sum_price<<endl;
return 0;
}