description

Farmer John的N(1<=N<=1000)头奶牛分别居住在农场所拥有的B(1<=B<=20)个牛棚的某一个里。有些奶牛很喜欢她们当前住的牛棚,而另一些则讨厌再在它们现在所在的牛棚呆下去。

FJ在忍受了若干次奶牛的抱怨后,决定为所有奶牛重新安排牛棚,使最不满的那头奶牛与最高兴的奶牛的心情差异最小,即使这会让所有奶牛都更加郁闷。

每头奶牛都把她对各个牛棚的好感度从高到低排序后告诉了FJ。当然,如果一头奶牛被安排到的牛棚在她给出的列表中越靠后,她就会越郁闷。你可以认为奶牛的郁闷指数是她被分配到的牛棚在列表中的位置。奶牛们是斤斤计较的,她们无法容忍别的奶牛在自己喜欢的牛棚里快乐地生活,而自己却呆在一个自己不喜欢的牛棚里。每个牛棚都只能容纳一定数量的奶牛。FJ希望在每个牛棚都没有超出容量限制的前提下,使最郁闷和最高兴的奶牛的郁闷指数的跨度最小。

FJ请你帮他写个程序,来计算这个最小的郁闷指数跨度到底是多少。


analysis

  • 二分\(+\)网络流,考试没读懂题少考虑了一种情况

  • 对于每个牛棚,二分找出它到接下来最少第几个牛棚可以让所有牛住得下

  • 这个判断用二分图匹配或者跑网络流,因为牛棚很少于是枚举也行

  • \(S\)和牛连流量为\(1\)的边,牛和牛棚连流量为\(1\)的边,牛棚和\(T\)连流量为牛棚容量的边

  • 用\(SAP\)多快,记录最小值就好了


code

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 2005
#define MAXM 50005
#define INF 1000000007
#define ll long long
#define fo(i,a,b) for (ll i=a;i<=b;++i)
#define fd(i,a,b) for (ll i=a;i<=b;--i)
#define rep(i,a) for (ll i=last[a];i;i=next[i]) using namespace std; ll last[MAXM],next[MAXM],tov[MAXM],len[MAXM],cur[MAXM];
ll f[21],d[MAXN],gap[MAXN],a[MAXN][21];
ll n,m,S,T,tot=1,ans=INF; inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll min(ll x,ll y)
{
return x<y?x:y;
}
inline void link(ll x,ll y,ll z)
{
next[++tot]=last[x],last[x]=tot,tov[tot]=y,len[tot]=z;
next[++tot]=last[y],last[y]=tot,tov[tot]=x,len[tot]=0;
}
inline ll dfs(ll x,ll flow)
{
if (x==T)return flow;
ll ans=0;
for (ll i=cur[x];i;i=next[i])
{
cur[x]=i;
if (len[i] && d[tov[i]]+1==d[x])
{
ll tmp=dfs(tov[i],min(len[i],flow-ans));
ans+=tmp,len[i]-=tmp,len[i^1]+=tmp;
if (ans==flow)return ans;
}
}
cur[x]=last[x];
if (!(--gap[d[x]]))d[S]=n;
++gap[++d[x]];
return ans;
}
inline ll SAP()
{
ll flow=0;
while (d[S]<n)flow+=dfs(S,INF);
return flow;
}
inline bool judge(ll x,ll y)
{
memset(last,0,sizeof(last)),memset(next,0,sizeof(next));
memset(tov,0,sizeof(tov)),memset(len,0,sizeof(len));
memset(cur,0,sizeof(cur)),tot=1;
memset(gap,0,sizeof(gap)),memset(d,0,sizeof(d));
fo(i,1,n)link(S,i,1);fo(i,1,m)link(n+i,T,f[i]);
fo(i,1,n)fo(j,x,y)link(i,a[i][j]+n,1);
ll tmp=SAP();
return tmp==n;
}
inline ll binarysearch(ll x,ll l,ll r)
{
ll mid=(l+r)>>1;
while (l<=r)
{
mid=(l+r)>>1;
if (judge(x,mid))r=mid-1;
else l=mid+1;
}
return l;
}
int main()
{
freopen("T3.in","r",stdin);
n=read(),m=read();
fo(i,1,n)fo(j,1,m)a[i][j]=read();
fo(i,1,m)f[i]=read();
S=n+m+1,T=S+1;
fo(k,1,m)
{
ll next=binarysearch(k,k,m);
if (next<=m)ans=min(ans,next-k+1);
}
printf("%lld\n",ans);
return 0;
}

【JZOJ1259】牛棚安排的更多相关文章

  1. 【usaco 2006 feb gold】 牛棚安排

    终于自己独立做出来一道题QAQ然而本校数据实在太水不能确定我是不是写对了... 原题: Farmer John的N(1<=N<=1000)头奶牛分别居住在农场所拥有的B(1<=B&l ...

  2. POJ 2441 Arrange the Bulls 状态压缩递推简单题 (状态压缩DP)

    推荐网址,下面是别人的解题报告: http://www.cnblogs.com/chasetheexcellence/archive/2012/04/16/poj2441.html 里面有状态压缩论文 ...

  3. POJ 2441 Arrange the Bulls(状态压缩DP)

    题意很简单,n头牛,m个位置,每头牛有各自喜欢的位置,问安排这n头牛使得每头牛都在各自喜欢的位置有几种安排方法. 2000MS代码: #include <cstdio> #include ...

  4. 洛谷 P1209 修理牛棚== Codevs 2079 修理牛棚

    时间限制: 1 s   空间限制: 128000 KB   题目等级 : 黄金 Gold 题目描述 Description 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹 ...

  5. Bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 最短路,神题

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 218  Solved: ...

  6. BZOJ3389: [Usaco2004 Dec]Cleaning Shifts安排值班

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 45  Solved:  ...

  7. BZOJ 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

    题目 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MB Description      ...

  8. 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 102  Solved: ...

  9. USACO 1.3.2 Barn Repair 修理牛棚(贪心)

    Description 在一个夜黑风高,下着暴风雨的夜晚,农民约翰的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 剩下的牛一个紧挨着另一个被排成一行来过夜. 有些牛棚里有牛,有些没 ...

随机推荐

  1. 开发中运行mysql脚本,发现提示mysql提示Column count doesn't match value count at row 1错误

    开发中运行mysql脚本,发现提示mysql提示Column count doesn't match value count at row 1错误, 调试后发现是由于写的SQL语句里列的数目和后面的值 ...

  2. PAT_A1079#Total Sales of Supply Chain

    Source: PAT A1079 Total Sales of Supply Chain (25 分) Description: A supply chain is a network of ret ...

  3. Codeforces 1174B Ehab Is an Odd Person

    题目链接:http://codeforces.com/problemset/problem/1174/B 题意:给定长度 n 的数组,任意俩个相加为奇数的数可以交换数组中的位置,让这个数组尽量从小到大 ...

  4. Xtrabackup 热备

    Xtrabackup介绍Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁):m ...

  5. importError:cannot import name imsave/imread等模块

    首先要先看相应的库是否已经安裝成功 pip install numpy pip install pillow pip install scipy 都成功安装之后,执行: import scipy.mi ...

  6. 01->OpenGL 实验环境配置(glut)及简单实例

    --  简介  -- OpenGL是通过数学等理论知识定义3D或2D模型,由计算机通过流水线渲染技术进行渲染,产生逼真的场景图像,电影和游戏中的特效都有用到.每每看到精美的画面,真想自己也能做出如此作 ...

  7. VS2017打包

    转载:https://blog.csdn.net/Houheshuai/article/details/78518097 在要打包项目的解决方案 右键→添加→ 新建项目 ​ 后出现如下选择 ​ 如果没 ...

  8. 360自动抢票还不够,几行js代码设置无人值守

    360就是牛逼哄哄的...... 但是最近在使用360浏览器抢票的时候还是发现了一些体验不好的地方,比如搞着搞着就退出了登录,有时候能帮你自动登录进去,但是自动登录之后又不会帮你自动开始抢.然后验证码 ...

  9. leetcode-157周赛-5215黄金矿工

    题目描述: 方法一:dfs class Solution: def getMaximumGold(self, grid: List[List[int]]) -> int: maxx = 0 R, ...

  10. csps模拟92数列,数对,最小距离题解

    题面:https://www.cnblogs.com/Juve/articles/11767225.html 数列: 简化题意:已知a,b,c,求满足$a*x+b*y=c$的$x+y$最小值 然后ex ...