链接:
https://www.nowcoder.com/acm/contest/112/A
来源:牛客网
来源:牛客网
题目描述
现有n组人,m个地点,给出每组人的人数,每个地点可容纳的最大人数和选择的价格
要求一种方式,使得每组人都到一个各不相同的地点,最小化选择的价格
每个队伍的人都要在同一个地方每个地方只能有一个队伍
输入描述:
第一行n,m 第二行n个数,表示每组的人数 接下来m行,每行两个数,表示可容纳的最大人数和选择的价格
输出描述:
输出最小化选择的价格,无解输出-1
题解:
按照价格从小到大排序,对于当前价格最小的,在还没有
安排的组中选出可选的最大的一组。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+7;
set<int>s;
int a[maxn];
struct node
{
int num,cost;
}c[maxn];
bool cmp(const node &a,const node &b)
{
if(a.cost!=b.cost)
return a.cost<b.cost;
return a.num>b.num;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
int x;scanf("%d",&x);
a[x]++;
}
for(int i=0;i<maxn;i++)
{
if(a[i])
{
a[i]--;
s.insert(-i);//需要从大到小排序,因此存绝对值。
}
}
s.insert(1);//防止越界
for(int i=0;i<m;i++)
scanf("%d%d",&c[i].num,&c[i].cost);
sort(c,c+m,cmp);
ll ans=0;
if(n>m)
printf("-1\n");
else
{
int t=0;
for(int i=0;i<m;i++)
{
int k=*s.lower_bound(-c[i].num);
if(k!=1)
{
k=-k;
ans+=c[i].cost;t++;
a[k]--;
if(a[k]<0)
s.erase(-k);
}
}
if(t==n)printf("%lld\n",ans);
else printf("-1\n");
}
}