最小化价格+思维+简单queue

链接: https://www.nowcoder.com/acm/contest/112/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

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

输入描述:

第一行n,m
第二行n个数,表示每组的人数
接下来m行,每行两个数,表示可容纳的最大人数和选择的价格

输出描述:

输出最小化选择的价格,无解输出-1
示例1

输入

3 4
2 3 4
1 2
2 3
3 4
4 5

输出

12

备注:

所有数据小于1e5
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
ll rd(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

const int N=1e5+10;
int a[N];
struct AA{
    int p,m;
    bool operator<(const AA bb){
        return p<bb.p;
    }
}b[N];
int main(){
   // freopen("in.txt","r",stdin);
    int n=rd(),m=rd();
    rep(i,1,n)a[i]=rd();
    sort(a+1,a+1+n);
    rep(i,1,m)
        b[i].p=rd(),b[i].m=rd();
    sort(b+1,b+1+m);
    priority_queue<int> q;
    ll ans=0;
    for(int i=n,j=m;i>=1;i--){
        while(b[j].p>=a[i]&&j>=1){
            q.push(-b[j].m);
            j--;
        }
        if(q.empty())
            return puts("-1"),0;
        ans-=q.top();
        q.pop();
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ujn20161222/article/details/80307276
今日推荐