题意:给你一个n*m的矩阵a,然后定义一个数组b,我们可以在a数组中随机选择两行i,j(1<=i,j<=n,i和j可以相等)对于k∈[1,m]b_k = max(a_i,k,a_j,k),之后我们需要去最大化k∈[1,m],b_k的最小值
解法:实际解法我们可以把题意简单化就是要最大化最小值,那么可以考虑二分答案
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;
const int N = 1 << 10;
int a[maxn][10];
int vis[N];
int ans1,ans2;
int n,m;
bool check(int x){
memset(vis,0,sizeof(vis));
for(int i = 1; i <= n; i++){
int va = 0;
for(int j = 1; j <= m; j++){
if(a[i][j] >= x)
va |= 1 <<(j-1);
}
vis[va] = i;
}
for(int i = 0; i<(1 << m); i++){
if(vis[i]){
for(int j = 0; j<(1 << m); j++){
if(vis[j]){
if((i|j) == (1 << m) - 1){
ans1 = vis[i];
ans2 = vis[j];
return true;
}
}
}
}
}
return false;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++)cin >> a[i][j];
}
int l = 0,r = 0x3f3f3f3f;
while(l <= r){
int mid = l + r >> 1;
if(check(mid))l = mid + 1;
else r = mid - 1;
}
cout << ans1 << " " << ans2 << endl;```