HDU 2236 矩阵不同行列寻找 最小最大数的差值 最小 二分匹配+二分枚举区间
2013-10-20 21:01
543 查看
题意:
从矩阵每行中找一个数( 没有2个数在同一列 ) 使得找出来的数中最大值和最小值差 最小, 输出差值
首先设矩阵中最小的数是 vmin , 最大的数是 vmax, 则答案一定 [0, vmax - vmin]
显然找出来的数一定在 区间 [ 0 + x, 0 + ans + x ] ( x为合法值)
枚举x,如果能找到匹配出的结果 都是在这个区间上,说明这个区间合法 => 这个ans合法,
二分至ans ,再判断,注意二分的上下
从矩阵每行中找一个数( 没有2个数在同一列 ) 使得找出来的数中最大值和最小值差 最小, 输出差值
首先设矩阵中最小的数是 vmin , 最大的数是 vmax, 则答案一定 [0, vmax - vmin]
显然找出来的数一定在 区间 [ 0 + x, 0 + ans + x ] ( x为合法值)
枚举x,如果能找到匹配出的结果 都是在这个区间上,说明这个区间合法 => 这个ans合法,
二分至ans ,再判断,注意二分的上下
#include<stdio.h> #include<string.h> #define max Max #define min Min #define N 105 int map , n, vmin, vmax; int lie , vis , p, max, min, mid; bool match(int x){ for(int i = 1; i <= n; i++) { if(vis[i])continue; if(map[x][i] > p + mid || map[x][i] < p)continue; vis[i] = 1; if( !lie[i] || match(lie[i])){ lie[i] = x; return true; } } return false; } bool solve(){ memset(lie, 0, sizeof(lie )); for(int i = 1; i <= n; i++) { memset(vis, 0, sizeof(vis)); if( !match(i) )return false; } return true; } int main(){ int T, i, j; scanf("%d",&T); while(T--){ vmin = 100; vmax = 0; scanf("%d",&n); for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) { scanf("%d",&map[i][j]); if(vmin > map[i][j]) vmin = map[i][j]; if(vmax < map[i][j]) vmax = map[i][j]; } min = 0, max = vmax - vmin; while( 1 ) { bool ok = false; mid = (min + max) >>1 ; for(p = vmin; p + mid <= vmax ; p++) { if(solve()) { ok = true; break; } } if( ok )//如果存在一个匹配使得所有数在区间 [p, p+mid] { max = mid; } if(min == mid)break; if(!ok ) min = mid; } printf("%d\n",max); //结果区间是在[0+x, 0+max +x] } return 0; } /* 99 1 1 2 1 2 3 4 3 1 2 3 4 5 6 7 8 9 3 9 7 8 6 4 2 1 5 3 ans: 0 1 4 3 */
相关文章推荐
- HDU-1150(求最小覆盖顶点数=二分最大匹配数)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)
- hdu 2236(最大匹配+枚举上下界)
- A new Graph Game HDU - 3435 (二分匹配思想)(最小花费最大流)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)
- HDU 2236 无题II 二分+最大匹配
- hdu 2236(最大匹配+枚举上下界)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)
- HDU 2236 无题II【二分+最大匹配】
- hdu 3081 【二分匹配+并查集+删边||最大路+并查集+二分枚举】
- hdu 1150 最小覆盖点==最大二分匹配 Machine Schedule
- hdu 2236 无题II(二分法,枚举,二分图最大匹配)
- HDU 4160 最小路径覆盖 = 顶点数 - 最大匹配数 二分匹配
- HDU 2819 矩阵 最大二分匹配
- hdu 1054 Strategic Game(模板) 最大二分匹配,最小点覆盖 匈牙利算法
- HDU 1498 50 years, 50 colors(二分最大匹配之最小点覆盖)
- hdu 无题II 二分+枚举+最大匹配
- HDU1281(最大二分匹配+枚举)
- 【BZOJ4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配
- codeforces 366D 求1-n点最大区间长度 枚举区间左端+二分区间右端dfs判可行