(二)黑白点的匹配(Problem Set 1714):
1.问题描述
设平面上分布着n个白点和n个黑点,每个点用一对坐标(x, y)表示。一个黑点b=(xb,yb)支配一个白点w=(xw, yw)当且仅当xb>=xw和yb>=yw。若黑点b支配白点w,则黑点b和白点w可匹配(可形成一个匹配对)。在一个黑点最多只能与一个白点匹配,一个白点最多只能与一个黑点匹配的前提下,求n个白点和n个黑点的最大匹配对数。
2.具体要求
Input
输入的第一行是一个正整数k,表示测试例个数。接下来几行是k个测试例的数据,每个测试例的数据由三行组成,其中第一行含1个正整数n(n<16);第二行含2n个实数xb1, yb1,xb2, yb2,…, xbn, ybn, (xbi, ybi),i=1, 2, …, n表示n个黑点的坐标;第三行含2n个实数xw1, yw1,xw2, yw2,…, xwn, ywn,(xwi, ywi),i=1, 2, …, n表示n个白点的坐标。同一行的实数之间用一个空格隔开。
Output
对于每个测试例输出一行,含一个整数,表示n个白点和n个黑点的最大匹配对数。
3.测试数据
Sample Input
1
3
5.0 3.0 5.0 -1.0 4.0 4.0
2.0 3.5 2.0 2.0 -2.0 -2.0
Sample Output
3
我的贪心思路:
1
.先将黑棋和白棋可匹配和不可匹配关系用一个二维数组保存
可匹配为1,不可匹配为0
计算出如下图b1,b2,b3是黑点 w1,w2,w3是白点 1代表可以匹配,0代表不能。
计算代码如下
2
.根据上面的匹配表算出优先匹配的棋子
如果是可匹配那么计算出它的匹配后会影响到多少个棋子
如图b1和w2它们可匹配,如果它们匹配会影响到w3的一个选择和b3的一个选择 横行和竖行有3个1
于是我得到一个这样的表
计算的代码如下:
3
.影响最小则匹配优先级最高(贪心选择)
因为如果先匹配了影响大的可能会造成:
影响小的匹配点被PASS掉了(一个白点只能和一个黑点匹配)
这样匹配数量就变少了
如图影响最小是3 有3个匹配从中随便选一个 //按顺序就选b1,w2
4
.选择影响最小的匹配完后更新匹配表
变成
5
.判断是否匹配完了,没有就重复2。
附上代码:
import java.util.Scanner;
public class ChessMatch {
static int[][] Calculated_Matchtable(float[] xb,float[] yb,float[] xw,float[] yw) {
int[][] matchtable = new int[xb.length][xb.length];
// 先默认都不能匹配
for (int i = 0; i < matchtable.length; i++)
for (int j = 0; j < matchtable.length; j++)
matchtable[i][j] = 0;
// 可以匹配的点设置为1
for(int i=0;i<xb.length;i++)
for(int j=0;j<xb.length;j++)
if(xb[i