Ashen—one

喜欢胡思乱想的萌新

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


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭