枚举最小值后,二分其他行的值,若其他行不存在比所枚举最小值大的值,那么跳出,如果都有,取最小,更新答案
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 107
#define INF 1000000007
using namespace std;
typedef long long LL;
int n,m;
LL a[MAX][MAX];
LL ans;
LL get ( int i , LL v )
{
int l = 1 , r = m , mid;
while ( l != r )
{
mid = l + r >> 1;
if ( a[i][mid] >= v ) r = mid;
else l = mid+1;
}
return a[i][l] - v;
}
int main ( )
{
while ( ~scanf ( "%d%d" , &n , &m ) )
{
for ( int i = 1 ; i <= n ; i++ )
{
for ( int j = 1 ; j <= m ; j++ )
scanf ( "%lld" , &a[i][j] );
sort ( a[i]+1 , a[i]+m+1 );
}
ans = INF;
for ( int i = 1 ; i <= n ; i++ )
for ( int j = 1 ; j <= m ; j++ )
{
LL temp = -1;
bool flag = false;
for ( int k = 1 ; k <= n ; k++ )
{
if ( a[k][m] < a[i][j] )
{
flag = true;
break;
}
if ( k != i )
temp = max ( get ( k , a[i][j] ) , temp );
}
if ( flag ) continue;
if ( temp != -1 )
ans = min ( temp , ans );
}
printf ( "%lld\n" , ans );
}
}