无题II HDU - 2236 【二分图+二分答案】
题目
这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小。
Input
输入一个整数T表示T组数据。 对于每组数据第一行输入一个正整数n(1<=n<=100)表示矩阵的大小。 接着输入n行,每行n个数x(0<=x<=100)。
Output
对于每组数据输出一个数表示最小差值。
Sample Input
1
4
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
Sample Output
3
分析
首先就可以想到,如果对于找出来的n个数,刚好属于某个区间[l,r],那么显然可以得到答案就是r-l。所以我们直枚举所有可能的区间,然后二分图匹配,让所有可能的匹配权值都属于这个区间,如果成立,那么这个区间是可行的。
然后就可以想到,对于答案来说是要找一个区间长度最小的区间,然后我们就二分一下,然后枚举所有长度为当前答案的区间,然后判断当前区间是否可行,如果当前区间可行,就说明当前答案正确,更新一下就完事了。
代码
#include <bits/stdc++.h>
const int inf = 0x3f3f3f3f;
using namespace std;
const int maxn = ;
const int maxm = ;
int umaxn, vmaxn;
int a[maxn][maxn];
bool us[maxn];
int li[maxn];
bool dfs(int u, int ll, int rr) {
for(int v=; v<=umaxn; v++) {
if(a[u][v] >=ll && a[u][v]<=rr && !us[v]) {
us[v] = true;
if(li[v] == - || dfs(li[v], ll, rr)) {
li[v] = u;
return true;
}
}
}
return false;
}
bool ts(int mid, int ll , int rr) {
int res = ;
memset(li,-,sizeof(li));
for(int u=; u<=umaxn; u++) {
memset(us,,sizeof(us));
if(!dfs(u, ll , rr)) return false;
}
return true;
}
bool check(int mid){
for(int i=;i+mid<=;i++){
if(ts(mid, i, i+mid)){
return true;
}
}
return false;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
int n;
scanf("%d", &n);
umaxn = vmaxn = n;
int Min = inf, Max = -;
for(int i=; i<=n; i++)
for(int j=; j<=n; j++){
scanf("%d",&a[i][j]);
Min = min(Min, a[i][j]);
Max = max(Max, a[i][j]);
}
int l = , r = Max - Min;
while(l<=r) {
int mid = (l+r)>>;
if(check(mid)){
r = mid-;
} else l = mid+;
}
printf("%d\n", l);
}
return ;
}
无题II HDU - 2236 【二分图+二分答案】的更多相关文章
- 无题II hdu 2236(二分枚举区间)
分析:只需要用二分找一个区间,然后不断枚举这个区间是否可以达到最大匹配,一直二分到答案为止. 代码: =============================================== ...
- (二分匹配“匈牙利算法”)无题II --HDU --2236
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2236 代码: #include<cstdio> #include<cstring> ...
- 【洛谷 P1525】 关押罪犯 (二分图+二分答案)
题目链接 并查集+贪心当然是可以做的. 但我用二分图+二分答案. 二分一个\(mid\),删去所有边权小于等于\(mid\)的边,看有没有奇环存在,如果存在,则\(mid\)不行. #include ...
- hdu 2236(二分图最小点覆盖+二分)
无题II Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- U - Inviting Friends HDU - 3244(二分答案 + 完全背包)
U - Inviting Friends HDU - 3244 You want to hold a birthday party, inviting as many friends as possi ...
- P1182 数列分段`Section II` P1316 丢瓶盖 二分答案
题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 142451要分成 ...
- HDU 2236 无题II(二分图匹配+二分)
HDU 2236 无题II 题目链接 思路:行列仅仅能一个,想到二分图,然后二分区间长度,枚举下限.就能求出哪些边是能用的,然后建图跑二分图,假设最大匹配等于n就是符合的 代码: #include & ...
- 【最大匹配+二分答案】HDU 2236 无题II
题目内容 这是一个简单的游戏,在一个\(n×n\)的矩阵中,找\(n\)个数使得这\(n\)个数都在不同的行和列里并且要求这\(n\)个数中的最大值和最小值的差值最小. 输入格式 输入一个整数\(T\ ...
- Hdu 2236 无题II 最大匹配+二分
题目链接: pid=2236">Hdu 2236 解题思路: 将行和列理解为二分图两边的端点,给出的矩阵即为二分图中的全部边, 假设二分图能全然匹配,则说明 不同行 不同列的n个元素 ...
随机推荐
- css背景图定位和浮动
网站图标引入:<link rel="shortcut icon" href="ico图标地址"> 背景图片 background-image: u ...
- Redis 的原理与应用场景及数据库关系
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一. Redis 是什么? Redis是一个开源的使用ANSIC语言编写.支持网络.单进程单线程.可基于 ...
- Java实现 蓝桥杯VIP 算法训练 矩阵加法
时间限制:1.0s 内存限制:512.0MB 问题描述 给定两个N×M的矩阵,计算其和.其中: N和M大于等于1且小于等于100,矩阵元素的绝对值不超过1000. 输入格式 输入数据的第一行包含两个整 ...
- Java实现指定年份月份的日历表
输入指定的年份与月份,看这个月的日历表 package Xueying_Liu; import java.util.Scanner; public class rilibiao { public st ...
- 我的Dos笔记
DOS笔记:DOS是英文Disk Operating System的缩写,意思是“磁盘操作系统”[drive:][path][filename] 指定要列出的驱动器.目录和/或文件. /A ...
- cocos2dx Android 使用ant 批量打包
参考文章: 例子:http://www.2cto.com/kf/201305/208139.html http://blog.csdn.net/ljb_blog/article/details/127 ...
- 遇到Error:Execution failed for task ':app:transformClassesWithDexForDebug'的解决方案
原因:项目中包含了所有的google play service 解决:只需要使用必要的服务即可 将compile 'com.google.android.gms:play-services:8.1.0 ...
- 安装apoc插件
APOC是Neo4j 3.3版本推出时推荐的一个Java存储过程包,包含丰富的函数和存储过程,作为对Cypher所不能提供的复杂图算法和数据操作功能的补充,APOC还具有使用灵活.高性能等优势. 1. ...
- CORS跨域漏洞学习
简介 网站如果存CORS跨域漏洞就会有用户敏感数据被窃取的风险. 跨域资源共享(CORS)是一种浏览器机制,可实现对位于给定域外部的资源的受控访问.它扩展了同源策略(SOP)并增加了灵活性.但是,如果 ...
- 简单5步,轻松debug K8S服务!
作者: Ram Rai,性能.可扩展性以及软件架构的爱好者 原文链接: https://medium.com/better-programming/debug-your-kubernetes-serv ...