思路:将攻击方按攻击力排序,防御方按防御力排序,对于每一个攻击力大于防御力的,就找有没有一个攻击方的防御力比防御方的攻击力高的,有则必定是最优解
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 1e5+6;
struct Node
{
int att;
int def;
}a[maxn],b[maxn];
bool cmp1(Node a,Node b)
{
return a.att>b.att;
}
bool cmp2(Node a,Node b)
{
return a.def>b.def;
}
multiset<int>vis;
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
printf("Case #%d: ",cas++);
vis.clear();
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1;i<=n;i++)scanf("%d%d",&a[i].att,&a[i].def);
for(int i = 1;i<=m;i++)scanf("%d%d",&b[i].att,&b[i].def);
sort(a+1,a+1+n,cmp1);
sort(b+1,b+1+m,cmp2);
int ans = 0;
int flag = 1;
for(int i = 1,j=1;j<=m;j++)
{
while(i<=n&&a[i].att>=b[j].def)
vis.insert(a[i++].def);
if(vis.empty())
{
printf("-1\n");
flag=0;
break;
}
set<int>::iterator it = vis.upper_bound(b[j].att);
if(it!=vis.end())vis.erase(it);
else vis.erase(vis.begin()),ans++;
}
if(flag)
printf("%d\n",n-ans);
}
}