题目链接: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;
}