AtCoder Regular Contest 092 C - 2D Plane 2N Points(二分图匹配)

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

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

Sample Output 1

Copy
2

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


Sample Input 2

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

Sample Output 2

Copy
2

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


Sample Input 3

Copy
2
2 2
3 3
0 0
1 1

Sample Output 3

Copy
0

It is possible that no pair can be formed.


Sample Input 4

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

Sample Output 4

Copy
5

Sample Input 5

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

Sample Output 5

Copy
4
题意
给你n个二维坐标点A,再给n个二维坐标点B,如果B的x和y均大于A,这两个点可以匹配,求A的最大匹配
题解
一道二分图匹配的题,算是比较基础的题
当然这个题可以用贪心从小的开始,每次都选择B里与其最相近的元素
代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N=310;
 5 pair<int,int> p[N];
 6 int vis[N],match[N];
 7 int n;
 8 int Find(int u)
 9 {
10     for(int i=n+1;i<=n+n;i++)
11     {
12         if(p[i].first>p[u].first&&p[i].second>p[u].second&&!vis[i])
13         {
14             vis[i]=1;
15             if(!match[i]||Find(match[i]))
16             {
17                 match[i]=u;
18                 return 1;
19             }
20         }
21     }
22     return 0;
23 }
24 int main()
25 {
26     cin>>n;
27     for(int i=1;i<=n+n;i++)
28         cin>>p[i].first>>p[i].second;
29     int ans=0;
30     for(int i=1;i<=n;i++)
31     {
32         memset(vis,0,sizeof(vis));
33         if(Find(i))
34             ans++;
35     }
36     cout<<ans;
37     return 0;
38 }

 

转载于:https://www.cnblogs.com/taozi1115402474/p/8724413.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值