質問の意味:n頭の牛がBスロットを見つけ、各スロットの満足度は異なります。スロットには容量制限があります。すべての牛に、満足度のギャップができるだけ少ない独自のスロットを見つけて
もらいます。アイデア:二分法の回答+二者間グラフのマッチング
注:二分法答えは、上限と下限に注意を払う必要があります。この質問では、下限に0、WAに1を使用する必要があります。
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
typedef double db;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define per(i,s,t) for(int i=s;i>=t;i--)
#define me0(ar) memset(ar,0,sizeof ar)
#define me1(ar) memser(ar,-1,sizeof ar)
const int N=1e3+5;
int n,b;
int c[N],g[N][N],lin[N][N];
bool vis[N];
bool dfs(int p,int x,int y){
rep(i,x,y){
int v=g[p][i];
if(vis[v]) continue;
vis[v]=1;
if(lin[v][0]<c[v]){
lin[v][++lin[v][0]]=p;
return 1;
}
rep(j,1,lin[v][0])
if(dfs(lin[v][j],x,y)){
lin[v][j]=p;
return 1;
}
}
return 0;
}
bool pd(int x,int y){
me0(lin);
rep(i,1,n){
me0(vis);
if(!dfs(i,x,y)) return 0;
}
return 1;
}
bool op(int d){
rep(i,1,b-d)
if(pd(i,i+d)) return 1;
return 0;
}
int main(){
while(cin>>n>>b){
me0(g);
me0(c);
rep(i,1,n)
rep(j,1,b) cin>>g[i][j];
rep(i,1,b) cin>>c[i];
int l=0,r=b,ans;
while(l<r){
int m=(l+r)>>1;
if(op(m)) r=m;
else l=m+1;
}
cout<<l+1<<endl;
}
return 0;
}