/*先对一维的h排序,然后用alice的牌去覆盖bob最大能覆盖的w,由此可以得出最大能覆盖的值*/
题意是这样的Alice和Bob同时拥有n张牌,问Alice最多能覆盖Bob多少张牌!开始以为是田忌赛马问题,后来发现是个二维的,一次排序根本就搞不定。于是同样采用贪心算法,进行两次排序,果断超时!海量的数据,只能无耻的用STL了。点击打开链接
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm>
#define N 100005
using namespace std;
struct node
{
int h,w;
node(){h=w=0;}
}a[N],b[N];
multiset<int> c;
int cmp(node x,node y)
{
return x.h<y.h;
}
int main ()
{
freopen("a.txt","r",stdin);
int k,i,j,t,n,res;
for(scanf("%d",&t),k=0;k<t;k++)
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d%d",&a[i].h,&a[i].w);
sort(a,a+n,cmp);
for(i=0;i<n;i++) scanf("%d%d",&b[i].h,&b[i].w);
sort(b,b+n,cmp);
//先按h排序,保证所有的h维满足从大到小排序
multiset<int>::iterator it;
c.clear();
for(res=i=j=0;i<n;i++)
{
while(j<n && a[i].h>=b[j].h)
{
c.insert(b[j].w);j++;
}
it=c.upper_bound(a[i].w);
if(it!=c.begin() && !c.empty())
{
it--;c.erase(it);res++;
}
}
printf("%d\n",res);
}
return 0;
}