Wannafly挑战赛15 - A最小化价格

链接: 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

思路:贪心的思想

把每个地点的价钱从小到大排序,尽量让较多的人去到钱较少的组里

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<set>
using namespace std;
typedef pair<int,int> P;
multiset<int>team;
priority_queue<P,vector<P>,greater<P> >place;//地点按照价钱从小到大排
int main(){
    int n,m,num,a,b;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%d",&num);
        team.insert(num);
    }
    for(int i=0;i<m;i++){
        scanf("%d%d",&a,&b);
        place.push(P(b,a));//以价格排序
    }

    int sum=0;
    while(place.size()){
        P p=place.top();
        set<int>::iterator it=team.upper_bound(p.second);//返回第一个大于p.second的元素

        if(it!=team.begin()){/*若it=team.begin()说明第一个元素大于,则没有元素小于或等于,不符合。若没有一个元素大于,说明都符合,则it=team.end(),it--;指向集合中最大的元素*/
            sum+=p.first;
            team.erase(--it);
        }
        place.pop();
        if(!team.size())break;
    }

    if(team.size()){
        printf("-1\n");
    }
    else printf("%d\n",sum);
}

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/80293718
今日推荐