黑白点的匹配(Problem Set 1714)-贪心算法-

该博客介绍了如何解决Problem Set 1714的问题,即在平面上的黑白点中寻找最大匹配对数。博主提出了一种贪心策略,通过建立匹配矩阵、计算匹配影响并优先选择影响最小的匹配对,逐步实现最大匹配。虽然无法证明这是全局最优解,但目前未找到反例。博客附有详细代码和结果分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(二)黑白点的匹配(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值