LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
生活随笔
收集整理的這篇文章主要介紹了
LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#2006. 「SCOI2015」小凸玩矩陣
內存限制:256 MiB時間限制:1000 ms標準輸入輸出 題目類型:傳統評測方式:文本比較 上傳者: 匿名 提交提交記錄統計討論測試數據題目描述
小凸和小方是好朋友,小方給小凸一個?N×M N \times MN×M(N≤M N \leq MN≤M)的矩陣?A AA,要求小凸從其中選出?N NN?個數,其中任意兩個數字不能在同一行或同一列,現小凸想知道選出來的?N NN?個數中第?K KK?大的數字的最小值是多少。
輸入格式
第一行給出三個整數?N NN、M MM、K KK。
接下來?N NN?行,每行?M MM?個數字,用來描述這個矩陣。
輸出格式
輸出選出來的?N NN?個數中第?K KK?大的數字的最小值。
樣例
樣例輸入
3 4 2 1 5 6 6 8 3 4 3 6 8 6 3樣例輸出
3數據范圍與提示
1≤K≤N≤M≤250,1≤Ai,j≤109 1 \leq K \leq N \leq M \leq 250, 1 \leq A_{i, j} \leq 10 ^ 91≤K≤N≤M≤250,1≤A?i,j??≤10?9??
?
題目鏈接:https://loj.ac/problem/2006
題意:選出n個行列不相同的數,使得第k大最小。
思路:二分答案+二分匹配。二分答案,然后對行和列進行二分匹配,a[i][j]<=mid的最大匹配與n-k+1進行比較。
代碼:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<set> #include<queue> #include<stack> #include<map> #include<vector> using namespace std; typedef long long ll; typedef pair<int,int> P; const int maxn=300,maxm=1e5+100,inf=0x3f3f3f3f,mod=1e9+7; const ll INF=1e18+7; int n,m,k; ll a[maxn][maxn]; vector<int>G[maxn]; int match[maxn]; int used[maxn]; bool dfs(int u,ll mid) {for(int v=1; v<=m; v++){if(a[u][v]>mid) continue;if(used[v]) continue;used[v]=true;if(match[v]<0||dfs(match[v],mid)){match[v]=u;return true;}}return false; } bool check(ll mid) {int res=0;memset(match,-1,sizeof(match));for(int i=1; i<=n; i++){memset(used,false,sizeof(used));res+=dfs(i,mid);}//cout<<res<<endl;return res>=n-k+1?1:0; } int main() {scanf("%d%d%d",&n,&m,&k);ll l=INF,r=0;for(int i=1; i<=n; i++){ll mmin=INF,mmax=0;for(int j=1; j<=m; j++){scanf("%d",&a[i][j]);l=min(l,a[i][j]),r=max(r,a[i][j]);}}ll ans=-1;while(l<=r){ll mid=(l+r)/2;//cout<<l<<" "<<r<<" "<<mid<<endl;if(check(mid)) r=mid-1,ans=mid;else l=mid+1;}printf("%lld\n",ans);return 0; } 二分答案+二分比配?
轉載于:https://www.cnblogs.com/GeekZRF/p/7309238.html
總結
以上是生活随笔為你收集整理的LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 左神-10 大数据
- 下一篇: 【阿里云API】 阿里云API调用的若干