题目链接点击打开链接
刚做这题时 受到田忌赛马的影响,打算用最大覆盖最大 结果WA了 。后来和学长讨论,原来我对 田忌赛马 就没理解好,用大一点点的覆盖这种方法才是通用的 只不过在一维的
田忌赛马中最大覆盖最大也是可以的,在代码实现时 最大覆盖最大 更简单些 。但是这题就不行了 。
改了方法后 还是WA 。原来我对upper bound 理解不好 忽略了对于边界值的处理。再次修改后 终于过了……
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
using namespace std;
struct Rect
{
long long h;
long long w;
};
bool cmp(Rect a,Rect b)
{
if(a.h==b.h)
return a.w< b.w;
return a.h<b.h;
}
Rect rect_a[100000];
Rect rect_b[100000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
multiset<long long> mul;//用multiset实现
multiset<long long> ::iterator it;
int n,i,j,cnt=0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%lld%lld",&rect_a[i].h,&rect_a[i].w);
}
sort(rect_a,rect_a+n,cmp);
for(i=0; i<n; i++)
{
scanf("%lld%lld",&rect_b[i].h,&rect_b[i].w);
}
sort(rect_b,rect_b+n,cmp);
j=0;
for(i=0; i<n; i++)
{
while(j<n)
{
if(rect_a[i].h>=rect_b[j].h)
{
mul.insert(rect_b[j].w);
j++;
}
if(rect_a[i].h<rect_b[j].h)
{
break;
}
}
it=mul.upper_bound(rect_a[i].w);
if(it==mul.begin()) continue;//边界值……WA了好几发……
if(mul.size()>0&&it!=mul.begin())it--;
if(mul.size()>0&&(*it)<=rect_a[i].w)
{
mul.erase(it);
cnt++;
}
}
cout<<cnt<<endl;
}
return 0;
}