华为OD机试统一考试D卷C卷 - 矩阵匹配
题目描述
从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。
输入描述
输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150
输入格式:
N M K
N*M矩阵
输出描述
N*M 的矩阵中可以选出 M! / N! 种组合数组,每个组合数组种第 K 大的数中的最小值。无需考虑重复数字,直接取字典排序结果即可。
注意:结果是第 K 大的数字的最小值
用例
输入
3 4 2
1 5 6 6
8 3 4 3
6 8 6 3
输出
3
N*M的矩阵中可以选出 M!/ N!种组合数组,每个组合数组种第 K 大的数中的最小值; 上述输入中选出数组组合为: 1,3,6; 1,3,3; 1,4,8; 1,4,3; ...... 上述输入样例中选出的组合数组有24种,最小数组为1,3,3,则第2大的最小值为3
Java
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int n, m, k; // n、m、k 分别表示矩阵的行数、列数和要求的第K大数
static int[][] matrix; // matrix 用于存储输入的矩阵
static int[] match; // match 数组用于存储匹配信息,match[j] = i 表示第j列与第i行匹配
static boolean[] vis; // vis 数组用于标记每一列在当前增广路中是否被访问过
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt(); // 读取行数
m = sc.nextInt(); // 读取列数
k = sc.nextInt(); // 读取k值
int min = 1, max = Integer.MIN_VALUE; // 初始化二分查找的上下界
matrix = new int[n][m]; // 初始化矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
机试E卷D卷刷题日记 文章被收录于专栏
机试刷题记录