您的位置:首页 > 其它

CFgym:Of Zorcs and Axes(贪心)

2017-05-08 23:04 225 查看


题意:有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
, v
;
set<pair<int,int> >s;
int ans
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: