您的位置:首页 > 理论基础 > 计算机网络

2012长春网络赛 B题(贪心+multiset处理二维问题)

2012-09-19 21:05 357 查看
题意:Alice 和Bob各有N个矩形,每个矩形都已自己的高和宽,矩形a能够覆盖矩形b的条件是a.h>=b.h && a.w >= b.w。

问:Alice的矩形最多能覆盖多少个Bob的矩形。(每个矩形只能用一次)

#include<cstdio>
#include<cstring>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;

//模拟存放节点信息
struct NODE { int h, w; };
NODE a[200000], b[200000];

int cmp(const void *p1, const void *p2)
{
NODE *p3 = (NODE*)p1; //w升序,h升序
NODE *p4 = (NODE*)p2;
if(p3->w == p4->w)
return p3->h - p4->h;
return p3->w - p4->w;
}

/*
void show(int N)
{
for(int i = 0; i < N; i++)
printf("a[%d].h = %d, a[%d].w = %d\n", i, a[i].h, i, a[i].w);

for(int i = 0; i < N; i++)
printf("b[%d].h = %d, b[%d].w = %d\n", i, b[i].h, i, b[i].w);
}
*/

int main()
{
int T, N;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);

int i, j;
for(i = 0; i < N; i++)
scanf("%d%d",&a[i].h, &a[i].w);
for(i = 0; i < N; i++)
scanf("%d%d",&b[i].h, &b[i].w);

qsort(a, N, sizeof(NODE), cmp);
qsort(b, N, sizeof(NODE), cmp);
//show(N);

i = j = 0;
int res = 0;
multiset<int, greater<int> > s;
multiset<int, greater<int> >::iterator it;

for(i = 0; i < N; i++)
{
while(b[j].w <= a[i].w)
{
s.insert(b[j].h);
j++;
}

if(s.empty() == true)
continue;

it = s.lower_bound(a[i].h);
int val = (*it);
if(it != s.end())
{
res++;
it = s.find(val);
s.erase(it);
}
}
printf("%d\n",res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐