AtCoder - 3942
On a two-dimensional plane, there are N red points and N blue points. The coordinates of the i-th red point are (ai,bi), and the coordinates of the i-th blue point are (ci,di).
A red point and a blue point can form a friendly pair when, the x-coordinate of the red point is smaller than that of the blue point, and the y-coordinate of the red point is also smaller than that of the blue point.
At most how many friendly pairs can you form? Note that a point cannot belong to multiple pairs.
All input values are integers.
1≤N≤100
0≤ai,bi,ci,di<2N
a1,a2,…,aN,c1,c2,…,cN are all different.
b1,b2,…,bN,d1,d2,…,dN are all different.
Input is given from Standard Input in the following format:
N
a1 b1
a2 b2
:
aN bN
c1 d1
c2 d2
:
cN dN
Print the maximum number of friendly pairs.
3
2 0
3 1
1 3
4 2
0 4
5 5
2
For example, you can pair (2,0) and (4,2), then (3,1) and (5,5).
3
0 0
1 1
5 2
2 3
3 4
4 5
2
For example, you can pair (0,0) and (2,3), then (1,1) and (3,4).
2
2 2
3 3
0 0
1 1
0
It is possible that no pair can be formed.
5
0 0
7 3
2 2
4 8
1 6
8 5
6 9
5 4
9 1
3 7
5
5
0 0
1 1
5 5
6 6
7 7
2 2
3 3
4 4
8 8
9 9
4
这道题是一道二分图匹配的题目,很明显就是将文中的红点与蓝点进行匹配,模型如图:
如此,代码便是打版,易完成了。
附上二分匹配模板:
int PD(int x)
{
for(int j=1;j<=n;j++)
{
if(line[x][j]&&!f[j])
{
f[j]=1;
if(o_t[j]==0||PD(o_t[j]))
{
o_t[j]=x;
return 1;
}
}
}
return 0;
}
AC代码:
#include
#include
#define N 105
using namespace std;
int n,o_t[N];
int ans;
bool line[N][N],f[N];
struct node
{
int x;int y;
}red[N];
struct node blue[N];
void read()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d %d",&red[i].x,&red[i].y);
for(int i=1;i<=n;i++)
scanf("%d %d",&blue[i].x,&blue[i].y);
}
int PD(int x)
{
for(int j=1;j<=n;j++)
{
if(line[x][j]&&!f[j])
{
f[j]=1;
if(o_t[j]==0||PD(o_t[j]))
{
o_t[j]=x;
return 1;
}
}
}
return 0;
}
int main()
{
read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(red[i].x1;
}
for(int i=1;i<=n;i++)
{
memset(f,0,sizeof f);
if(PD(i)) ans++;
}
printf("%d",ans);
}