【最大匹配+二分答案】HDU 2236 无题II
题目内容
这是一个简单的游戏,在一个\(n×n\)的矩阵中,找\(n\)个数使得这\(n\)个数都在不同的行和列里并且要求这\(n\)个数中的最大值和最小值的差值最小。
输入格式
输入一个整数\(T\),表示\(T\)组数据。
对于每组数据第一行输入一个正整数\(n(1\le n\le 100)\)表示矩阵的大小。
接着输入\(n\)行,每行\(n\)个数\(x(0\le x\le 100)\)。
输出格式
对于每组数据输出一个数表示最小差值。
样例输入
1
4
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
样例输出
3
思路
对于找出来的\(n\)个数,均属于区间\([l,r]\),那么答案就是\(r-l\)。所以枚举区间然后进行二分图匹配,让所有可能的匹配权值都属于这个区间即可。
二分图最大匹配+二分答案。
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=100+10;
const int INF=0x3f3f3f3f;
int n,ans,Min,Max;
int g[maxn][maxn],match[maxn];
bool vis[maxn];
bool Find(int u){
for(int i=1;i<=n;i++){
if(!vis[i]&&g[u][i]>=Min&&g[u][i]<=Max){
vis[i]=1;
if(!match[i]||Find(match[i])){
match[i]=u;
return true;
}
}
}
return false;
}
bool judge(){
memset(match,0,sizeof(match));
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));//这里记得初始化下
if(!Find(i))
return false;
}
return true;
}
int main(){
int T,minl,maxr;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
maxr=0;minl=INF;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&g[i][j]);
minl=min(g[i][j],minl);
maxr=max(g[i][j],maxr);//找到左右边界
}
}
int l=0;
int r=maxr-minl;//注意所求的答案是最小差值
ans=0;
while(l<=r){
bool flag=false;
int mid=(l+r)/2;
for(int i=minl;i+mid<=maxr;i++){
Min=i;Max=i+mid;
if(judge()){
flag=true;
break;
}
}
if(flag){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
printf("%d\n",ans);
}
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\)表示\(T\)组数据. 对于每组数 ...
- HDU 2236 无题Ⅱ
HDU 2236 无题Ⅱ 题目大意 这是一个简单的游戏,在一个\(n*n\)的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. solution 暴枚\(i ...
- Maximum Shortest Distance 最大团 二分答案 HDU 3585
题意:给出n个点 要求取k个点 这k个点中 距离最小的两个点要求距离最大 拿到手看不出是最大团 也看不出是二分答案(第一次用) 因为答案必然存在 一定有一个最值 所以用二分答案来做 最大距 ...
- 【最大匹配+二分答案】POJ 3057 Evacuation
题目大意 POJ链接 有一个\(X×Y\)的房间,X代表墙壁,D是门,.代表人.这个房间着火了,人要跑出去,但是每一个时间点只有一个人可以从门出去. 问最后一个人逃出去的最短时间,如果不能逃出去,输出 ...
- Marriage Match II 【HDU - 3081】【并查集+二分答案+最大流】
题目链接 一开始是想不断的把边插进去,然后再去考虑我们每次都加进去边权为1的边,直到跑到第几次就没法继续跑下去的这样的思路,果不其然的T了. 然后,就是想办法咯,就想到了二分答案. 首先,我们一开始处 ...
- bzoj 2402: 陶陶的难题II 二分答案维护凸包
2402: 陶陶的难题II Time Limit: 40 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 68 Solved: 45[Submi ...
- HDU 3586 二分答案+树形DP判定
HDU 3586 『Link』HDU 3586 『Type』二分答案+树形DP判定 ✡Problem: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...
随机推荐
- 利用jquery的$.Deferred方法在一个函数内获取另一个函数的返回值
使用场景:方法B需要方法A执行完成之后再执行,比如方法B中有用到方法A的变量:(需要引入jQuery1.5以后的版本) function A(){ var deffered = new $.Defer ...
- parseQueryString
var parseQueryString = function (url) { var reg = /([^\?\=\&]+)\=([^\?\=\&]*)/g; var o ...
- Linux:文件和用目录权限基础
首先,用ls -i 查看文件的信息: 红框框起来的部分:-rw-r--r-- 一共是10位,第一位表示文件类型,-表示文件,d表示文件夹/目录:后面9位则表示权限 其中前三位是该文件/目录所属者的权限 ...
- pthon中取整的几个方法round、int、math
取整的几种方法:1.四舍五入 round(x) 2.向下取整 int(x) 3.取商和余 4.向上取整,需要用到math.ceil(x)(可以理解成大于x且最接近x的整数)import math 5 ...
- [IDEA]Java:“程序包XXX不存在”问题的三种解决方案
###三种方案 ####01 出现jar包找不到的问题,首先有可能是项目依赖中有些jar没有下载完整 而mvn idea:idea这个命令可以检查并继续下载未下载完整的依赖jar. 在命令行输入mvn ...
- 并发编程(二)Java中的多线程
一.创建多线程 创建多线程有以下几种方法: 继承Thread,重写run方法 实现Runnable接口,重写run方法[无返回值] 实现Callable接口,重写call方法[有返回值] 继承Thre ...
- python 进程(池)、线程(池)
进程.多进程.进程池 进程总概述 进程 from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): pr ...
- Mysql的ONLY_FULL_GROUP_BY
今天在测试环境遇到一个问题,本地测试是没有问题,在测试环境sql报错了: nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntax ...
- BurpSuite抓取本地包方法
本文重点在介绍抓本地包, 而非介绍抓包步骤 Burpsuite配置 默认配置即可 Chrome 浏览器配置 Falcon Proxy扩展程序配置浏览器代理. 需要抓包的网页是个本地搭建的网址, 一般会 ...
- spring注解(Component、依赖注入、生命周期、作用域)
1.注解 注解就是一个类,使用@加上注解名称,开发中可以使用注解取代配置文件 2.@Component 取代<bean class="">,@Component 取代 ...