csdn挑战赛 学习技能 枚举+二分

来源:互联网 发布:yum wireshark 编辑:程序博客网 时间:2024/06/06 03:15
枚举最小值后,二分其他行的值,若其他行不存在比所枚举最小值大的值,那么跳出,如果都有,取最小,更新答案
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define MAX 107#define INF 1000000007using 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 );    }}

0 0
原创粉丝点击