2D Plane 2N Points

2D Plane 2N Points

AtCoder - 3942

Problem Statement

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.

Constraints

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

Input is given from Standard Input in the following format:

N
a1 b1
a2 b2
:
aN bN
c1 d1
c2 d2
:
cN dN

Output

Print the maximum number of friendly pairs.

Sample Input 1

3
2 0
3 1
1 3
4 2
0 4
5 5

Sample Output 1

2
For example, you can pair (2,0) and (4,2), then (3,1) and (5,5).

Sample Input 2

3
0 0
1 1
5 2
2 3
3 4
4 5

Sample Output 2

2
For example, you can pair (0,0) and (2,3), then (1,1) and (3,4).

Sample Input 3

2
2 2
3 3
0 0
1 1

Sample Output 3

0
It is possible that no pair can be formed.

Sample Input 4

5
0 0
7 3
2 2
4 8
1 6
8 5
6 9
5 4
9 1
3 7

Sample Output 4

5

Sample Input 5

5
0 0
1 1
5 5
6 6
7 7
2 2
3 3
4 4
8 8
9 9

Sample Output 5

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<cstdio>
#include<cstring>
#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].x<blue[j].x&&red[i].y<blue[j].y)
            line[i][j]=1;
        }
    for(int i=1;i<=n;i++)
    {
        memset(f,0,sizeof f);
        if(PD(i)) ans++;
    }
    printf("%d",ans);
 } 

猜你喜欢

转载自blog.csdn.net/qq_37862149/article/details/79959672
今日推荐