无题II

题目链接

题目描述:

这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小。

输入:

输入一个整数T表示T组数据。
对于每组数据第一行输入一个正整数n(1<=n<=100)表示矩阵的大小。
接着输入n行,每行n个数x(0<=x<=100)。

输出:

对于每组数据输出一个数表示最小差值。

样例输入:

1
4
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

样例输出:

3

code:

题目描述的很简单,也比较清晰

求不同行,不同列的n个数字,使得他们的最大与最小数字之间的差最小

很显然,二分+二分图匹配

在建图的时候,一直找不到到底是谁与谁进行比配

后来发现,以行为一组,列为一组,就能保证不同行,不同列了

建议在写本题之前看一下匈牙利算法

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=150;
const int inf=0x3f3f3f3f;
int visit[maxn];
int match[maxn][maxn];
int pre[maxn];
int Max,Min;
int n;
bool dfs(int x){
	for(int i=1;i<=n;i++){
		if(visit[i]==0&&match[x][i]>=Min&&match[x][i]<=Max){
			visit[i]=1;
			if(pre[i]==0||dfs(pre[i])){
				pre[i]=x;
				return true;
			} 
		}
	}
	return false;
}
bool findd(){
	memset(pre,0,sizeof(pre)); 
	for(int i=1;i<=n;i++){
		memset(visit,0,sizeof(visit));
		if(!dfs(i))return false;
	}
	return true;
}
int main()
{
	int ttt;
	scanf("%d",&ttt);
	while(ttt--){
		scanf("%d",&n);
		memset(match,0,sizeof(match));
		memset(pre,0,sizeof(pre));
		int maxx=-1,minn=inf;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				scanf("%d",&match[i][j]);
				maxx=max(match[i][j],maxx);
				minn=min(minn,match[i][j]);
			}
		}
		int lb=-1,ub=maxx-minn+1,mid,flag;
		while(ub-lb>1){
			mid=(lb+ub)/2;
			flag=0;
			for(int i=0;i+mid<=maxx;i++){
				Min=i;Max=i+mid;
				if(findd()){
					flag=1;
					break;
				}
			}
			if(flag)ub=mid;
			else lb=mid;
		}
		printf("%d\n",ub);
	}
	return 0;
 } 

 

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,广泛应用于图像处理、计算机视觉和模式识别等领域。物体识别是OpenCV的一个重要应用场景,以下是一些常见的物体识别方法和技术: 1. **特征提取与匹配**: - **SIFT(尺度不变特征变换)****SURF(加速稳健特征)**:这些算法用于检测和描述局部特征,能够在图像中识别相同的物体,即使它们的大小、旋转或光照条件发生变化。 - **ORB(定向快速旋转BRIEF)**:一种快速的特征检测和描述算法,适用于实时应用。 2. **模板匹配**: - 通过在图像中滑动一个模板(已知物体的图像),并计算模板与图像区域的相似度,来找到物体的位置。 3. **机器学习与深度学习**: - **支持向量机(SVM)**:用于分类和回归分析,可以用于物体识别任务。 - **卷积神经网络(CNN)**:深度学习模型,特别适合处理图像数据,能够自动学习图像的特征并进行分类。 4. **目标检测算法**: - **Haar级联分类器**:基于积分图和AdaBoost算法,用于实时人脸检测。 - **YOLO(You Only Look Once)****SSD(Single Shot MultiBox Detector)**:实时目标检测算法,能够在单次前向传播中同时进行目标定位和分类。 5. **实例分割**: - **Mask R-CNN**:在目标检测的基础上,进一步分割目标的精确轮廓。 OpenCV提供了丰富的API和工具,可以方便地实现上述方法。以下是一个简单的示例代码,展示如何使用OpenCV进行模板匹配: ```python import cv2 import numpy as np # 读取原始图像和模板图像 original_image = cv2.imread('original_image.jpg') template = cv2.imread('template.jpg') template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) w, h = template_gray.shape[::-1] # 转换为灰度图 gray_original = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY) # 模板匹配 result = cv2.matchTemplate(gray_original, template_gray, cv2.TM_CCOEFF_NORMED) threshold = 0.8 loc = np.where(result >= threshold) # 绘制矩形框 for pt in zip(*loc[::-1]): cv2.rectangle(original_image, pt, (pt[0] + w, pt[1] + h), (0, 255, 255), 2) # 显示结果 cv2.imshow('Detected', original_image) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值