HDU 2236 无题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
题解
二分答案, 二分差值, 每次用匈牙利算法检查是否合法,合法就增加差值, 不合法就减少差值, 找到最大且合法的差值
代码
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 101;
int n, a[N][N], match[N], T;
bool vis[N];
bool dfs(int u, int l, int r) {
for (int v = 1; v <= n; v++) {
if (a[u][v] >= l && a[u][v] <= r && !vis[v]) {
vis[v] = true;
if (match[v] == -1 || dfs(match[v], l, r)) {
match[v] = u;
return true;
}
}
}
return false;
}
bool hungry(int mid, int l, int r) {
int res = 0;
memset(match, -1, sizeof(match));
for (int u = 1; u <= n; u++) {
memset(vis, 0, sizeof(vis));
if (!dfs(u, l, r)) return false;
}
return true;
}
bool check(int mid) {
for (int i = 0; i + mid <= 100; i++)
if (hungry(mid, i, i + mid))return true;
return false;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
int minv = inf, maxv = -1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
scanf("%d", &a[i][j]);
minv = min(minv, a[i][j]);
maxv = max(maxv, a[i][j]);
}
int l = 0, r = maxv - minv;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid - 1;
else l = mid + 1;
}
printf("%d\n", l);
}
return 0;
}
HDU 2236 无题II 题解的更多相关文章
- HDU 2236 无题II(二分图匹配+二分)
HDU 2236 无题II 题目链接 思路:行列仅仅能一个,想到二分图,然后二分区间长度,枚举下限.就能求出哪些边是能用的,然后建图跑二分图,假设最大匹配等于n就是符合的 代码: #include & ...
- Hdu 2236 无题II 最大匹配+二分
题目链接: pid=2236">Hdu 2236 解题思路: 将行和列理解为二分图两边的端点,给出的矩阵即为二分图中的全部边, 假设二分图能全然匹配,则说明 不同行 不同列的n个元素 ...
- 【最大匹配+二分答案】HDU 2236 无题II
题目内容 这是一个简单的游戏,在一个\(n×n\)的矩阵中,找\(n\)个数使得这\(n\)个数都在不同的行和列里并且要求这\(n\)个数中的最大值和最小值的差值最小. 输入格式 输入一个整数\(T\ ...
- HDU 2236 无题Ⅱ
HDU 2236 无题Ⅱ 题目大意 这是一个简单的游戏,在一个\(n*n\)的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. solution 暴枚\(i ...
- HDU 3567 Eight II(八数码 II)
HDU 3567 Eight II(八数码 II) /65536 K (Java/Others) Problem Description - 题目描述 Eight-puzzle, which is ...
- hdu 2236(二分图最小点覆盖+二分)
无题II Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Leetcode 137. 只出现一次的数字 II - 题解
Leetcode 137. 只出现一次的数字 II - 题解 137. Single Number II 在线提交: https://leetcode.com/problems/single-numb ...
- 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)
洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...
- 无题II
无题II Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- git提交拉取远程仓库
https://gitee.com/ ---- 国内服务器 https:/github.com/ ---- 国外服务器 git init ---- 初始化(创建主分支)仓库 git clone 拉取 ...
- System.getProperty("user.dir")获取的到底是什么路径?
一直用System.getProperty("user.dir")来获取文件目录,我在执行单个方法调试和执行测试脚本的时候碰到一个问题, 我写了一个类ElementInitiali ...
- [原创][开源] SunnyUI.Net 主题
SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...
- 刷一遍《剑指Offer》,你还需要这些知识!(一刷)
因为时间紧和基础薄弱,一刷<剑指Offer>就变成了速看. 我按照: 1.看题目思考一会: 2.上网找找关于题目里不懂的知识点: 3.看评论和官方题解的解法,尽量看懂,并及时弄懂不懂的地方 ...
- JVM 之 Linux定位CPU过高问题及优化
项目部署以后出行卡顿现象,所以对问题进行了排查,记录一下排查过程 (从CSDN编辑器贴过来的,图有水印) 1.找进程 top 可以发现,是Java进程导致的CPU过高,致使系统卡顿 2.找线程 ps ...
- Netty中的这些知识点,你需要知道!
一.Channel Channel是一个接口,而且是一个很大的接口,我们称之为“大而全”,囊括了server端及client端接口所需要的接口. Channel是一个门面,封装了包括网络I/O及相关的 ...
- liunx 常用快捷键
1.命令行快捷键ctrl + a //把光标移动到最前面ctrl + e //把光标移动到最后面ctrl + l //清屏ctrl + c //取消ctrl + u //把光标到行首的删除ctrl + ...
- 重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 持之以恒的重要性 初学编程往往都很懵,几乎在学习的过程中会遇到 ...
- 位运算实现加减乘除四则运算(Java)
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 本文是继< ...
- 状压DP 从TSP问题开始入门哦
一开始学状压DP难以理解,后来从TSP开始,终于入门了nice!!!! 旅行商问题 : 给定n个城市和两两相互的距离 ,求一条路径经过所有城市,并且路径达到最下仅限于; 朴树想法: 做n个城 ...