CFgym:Of Zorcs and Axes(贪心)


题意:有N个人,M件物品,每个人和物品都有x,y两个值,将这M件物品分配给这N个人,要求物品的x,y值均要大于等于人的x,y值才可以分给这个人,输出分配的方案,不行就输出-1。

思路:将人按x值由大到小处理,每次将剩余的thing[x]>=human[x]的物品扔进set,二分找出thing[y] >= human[y]的物品分配给他,就可以保证最优解了。

//reference pjh714332048
# include <bits/stdc++.h>
using namespace std;

const int N = 2e5+3;
struct node
{
    int x, y, id;
    bool operator <(const node&a)const
    {
        return x > a.x;
    }
}u[N], v[N];
set<pair<int,int> >s;
int ans[N];
int main()
{
    int n, m, x, y;
    scanf("%d",&n);
    for(int i=0; i<n; ++i)
        scanf("%d%d",&u[i].x,&u[i].y),u[i].id = i;
    scanf("%d",&m);
    for(int i=0; i<m; ++i)
        scanf("%d%d",&v[i].x,&v[i].y),v[i].id = i;
    sort(v, v+m);
    sort(u, u+n);
    int j=0;
    for(int i=0; i<n; ++i)
    {
        for(;v[j].x >= u[i].x; ++j)
            s.insert(make_pair(v[j].y, v[j].id));
        auto p = s.lower_bound(make_pair(u[i].y,0));
        if(p == s.end())
            return 0*puts("-1");
        ans[u[i].id] = p->second;
        s.erase(p);
    }
    for(int i=0; i<n; ++i)
        printf("%d%c",ans[i]+1,i==n-1?'\n':' ');
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值