来源:点击打开链接
去年网络赛第一场的第二个题。当时也想到了用贪心,可是超时了,现在复习了起来,发现可以用mutliset,先把alice和bob出的卡片按长度排序,再把所有剩下的矩形队进行贪心,贪当前alice与bob差距最小的矩形队。
用到了upper_bound()参数。
#include <iostream>
#include <set>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
multiset<int> tar;
multiset<int>::iterator it;
class box
{
public:
int length,high;
};
bool cmp(box a,box b)
{
return a.length<b.length;
}
box alice[200009],bob[200009];
int main()
{
int testcase;
cin>>testcase;
for(int t=1;t<=testcase;t++)
{
memset(alice,0,sizeof(alice));
memset(bob,0,sizeof(bob));
tar.clear();
int boxnum;
cin>>boxnum;
for(int i=0;i<boxnum;i++)
cin>>alice[i].length>>alice[i].high;
for(int j=0;j<boxnum;j++)
cin>>bob[j].length>>bob[j].high;
sort(alice,alice+boxnum,cmp);
sort(bob,bob+boxnum,cmp);
int ans=0;
int pos=0;
for(int i=0;i<boxnum;i++)
{
while(pos<boxnum && bob[pos].length<=alice[i].length)
{
tar.insert(bob[pos].high);
pos++;
}
it=tar.upper_bound(alice[i].high);
if(tar.size()>0 && it!=tar.begin())
it--;
if(tar.size()>0 && (*it)<=alice[i].high)
{
ans++;
tar.erase(it);
}
}
cout<<ans<<endl;
}
return 0;
}