Wannafly挑战赛15 A-最小化价格(贪心)


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

输入描述:
第一行n,m
第二行n个数,表示每组的人数
接下来m行,每行两个数,表示可容纳的最大人数和选择的价格
所有数据小于1e5

输出描述:
输出最小化选择的价格,无解输出-1

示例1
输入

3 4
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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值