1. 程式人生 > 其它 >D. Minimax Problem 題解(思維+二分)

D. Minimax Problem 題解(思維+二分)

題目連結

題目思路

算是一個套路題

就是二分,然後大於等於他為1,小於等於他為0

然後判斷是否有兩個集合的或為全集

程式碼

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=3e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n,m;
int a[maxn][10];
int vis[1000];
pair<int,int> pr;
bool check(int x){
    for(int i=0;i<(1<<m);i++){
        vis[i]=0;
    }
    for(int i=1;i<=n;i++){
        int sta=0;
        for(int j=1;j<=m;j++){
            if(a[i][j]>=x){
                sta+=(1<<(j-1));
            }
        }
        vis[sta]=i;
    }
    for(int i=0;i<(1<<m);i++){
        if(vis[i]==0) continue;
        for(int j=0;j<(1<<m);j++){
            if(vis[j]==0) continue;
            if((i|j)!=(1<<m)-1) continue;
            pr={vis[i],vis[j]};
            return true;
        }
    }
    return false;
}
signed 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=1e9,ans=-1;
    while(l<=r){
        int mid=(l+r)/2;
        if(check(mid)){
            ans=mid;
            l=mid+1;
        }else{
            r=mid-1;
        }
    }
    cout<<pr.fi<<" "<<pr.se<<'\n';
    return 0;
}


不擺爛了,寫題