#2006. 「SCOI2015」小凸玩矩阵

 

题目描述

小凸和小方是好朋友,小方给小凸一个 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​​

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,k,map[][],a[],b[],ans=0x3f3f3f3f;
bool vis[];
int cmp(int x,int y){return x>y;}
void check(){
for(int i=;i<=n;i++)b[i]=a[i];
sort(b+,b+n+,cmp);
ans=min(ans,b[k]);
}
void dfs(int now){
if(now==n+){
check();
return;
}
for(int i=;i<=m;i++){
if(!vis[i]){
vis[i]=;
a[now]=map[now][i];
dfs(now+);
vis[i]=;
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
int x;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&map[i][j]);
dfs();
printf("%d",ans);
}

20分 暴力

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 510
#define INF 1000000000
using namespace std;
int S,T,num=,head[maxn],n,m,k,dis[maxn],a[maxn][maxn];
struct node{int to,pre,v;}e[maxn*maxn];
void Insert(int from,int to,int v){
e[++num].to=to;e[num].v=v;e[num].pre=head[from];head[from]=num;
e[++num].to=from;e[num].v=;e[num].pre=head[to];head[to]=num;
}
int dinic(int x,int flow){
if(x==T||flow==)return flow;
int rest=flow;
for(int i=head[x];i;i=e[i].pre){
int to=e[i].to;
if(dis[to]==dis[x]+&&e[i].v>){
int delta=dinic(to,min(e[i].v,rest));
e[i].v-=delta;
e[i^].v+=delta;
rest-=delta;
}
}
return flow-rest;
}
bool spfa(){
memset(dis,-,sizeof(dis));
queue<int>q;q.push(S);dis[S]=;
while(!q.empty()){
int now=q.front();q.pop();
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(dis[to]==-&&e[i].v>){
dis[to]=dis[now]+;
if(to==T)return ;
q.push(to);
}
}
}
return dis[T]!=-;
}
int work(){
int res=;
while(spfa()){
res+=dinic(S,INF);
}
return res;
}
bool check(int x){
memset(head,,sizeof(head));num=;
for(int i=;i<=n;i++)Insert(S,i,);
for(int i=;i<=m;i++)Insert(i+n,T,);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(a[i][j]<=x)Insert(i,j+n,);
int res=work();
if(res>=n-k+)return ;
return ;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
S=;T=n+m+;
int mx=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
scanf("%d",&a[i][j]);
mx=max(mx,a[i][j]);
}
int l=,r=mx,ans=;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))r=mid-,ans=mid;
else l=mid+;
}
printf("%d",ans);
}

100分 二分答案+网络流

最新文章

  1. ios 关于问题 no matching provisioning profiles found
  2. 【leetcode】Evaluate Reverse Polish Notation
  3. IUS database
  4. iOS程序启动过程
  5. vue生命周期
  6. 【小月博客】用HTML5的File API做上传图片预览功能
  7. [eclipse]&ldquo;Syntax error, insert &quot;}&quot; to complete&rdquo;报错的解决方案
  8. 怎么在ZBrush中通过遮罩得到子物体
  9. vlc分析
  10. Golang-interface(四 反射)
  11. js获取当前页面的网址域名地址
  12. Client与Server
  13. javascript : detect at the end of bottom
  14. Project 4:Longest Ordered Subsequence
  15. eclipse中project facet问题
  16. EasyARM i.mx287学习笔记——通过modbus tcp控制GPIO
  17. c#: 创建桌面快捷方式
  18. 爬虫之抓取js生成的数据
  19. BZOJ4319 cerc2008 Suffix reconstruction 字符串 SA
  20. C语言截取从某位置开始指定长度子字符串方法

热门文章

  1. HashSet中是如何判断元素是否重复的
  2. HTTP-Runoob:HTPP Content-Type
  3. c# 实用精华知识点全解
  4. findwindow\sendmessage向第三方软件发送消息演示
  5. ORA-00904: 标识符无效——解决方案
  6. hadoop 常用端口 及模块介绍
  7. Shell编程进阶 2.2 shell数组
  8. 一个servlet处理多个请求(使用Method的反射机制)
  9. 【275】◀▶ Python 控制语句说明
  10. 1-1+zookeeper简介