题目链接:https://www.nowcoder.com/acm/contest/112/A
这道题当时没有做出来,一直没思路,感觉怎么排序都不对。首先需要对队伍的人数和宾馆的容纳人数从大到小排序,然后从大到小遍历每个队伍,将所有宾馆容纳数大于等于该队伍的人数的话就入队,然后根据优先队列对价格从小到大排序,对于一个队伍,从队列中取出价格最小的。因为是从大到小遍历的,所以队列里的宾馆的容纳数都是可以容纳下后面所有的队伍的。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
struct Node{
int num,val;
bool operator < (const Node &a) const{
return a.val < val;
}
}Edge[100005];
int pre[100005];
int n,m,sum,ans;
priority_queue<Node> q;
bool cmp(int x,int y){
return x > y;
}
bool cmp1(Node a,Node b){
return a.num > b.num;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&pre[i]);
for(int i=0;i<m;i++)scanf("%d%d",&Edge[i].num,&Edge[i].val);
sort(pre,pre+n,cmp);
sort(Edge,Edge+m,cmp1);
sum = 0;
ans = 0;
for(int i=0,j=0;i<n;i++){
while(j < m && pre[i] <= Edge[j].num){
q.push(Edge[j]);
j++;
}
if(q.empty())break;
Node Now = q.top();
sum += Now.val;
q.pop();
ans++;
}
// printf("%d\n",ans);
if(ans == n)printf("%d\n",sum);
else printf("-1\n");
return 0;
}