【JZOJ1259】牛棚安排
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】牛棚安排的更多相关文章
- 【usaco 2006 feb gold】 牛棚安排
终于自己独立做出来一道题QAQ然而本校数据实在太水不能确定我是不是写对了... 原题: Farmer John的N(1<=N<=1000)头奶牛分别居住在农场所拥有的B(1<=B&l ...
- POJ 2441 Arrange the Bulls 状态压缩递推简单题 (状态压缩DP)
推荐网址,下面是别人的解题报告: http://www.cnblogs.com/chasetheexcellence/archive/2012/04/16/poj2441.html 里面有状态压缩论文 ...
- POJ 2441 Arrange the Bulls(状态压缩DP)
题意很简单,n头牛,m个位置,每头牛有各自喜欢的位置,问安排这n头牛使得每头牛都在各自喜欢的位置有几种安排方法. 2000MS代码: #include <cstdio> #include ...
- 洛谷 P1209 修理牛棚== Codevs 2079 修理牛棚
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹 ...
- Bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 最短路,神题
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 218 Solved: ...
- BZOJ3389: [Usaco2004 Dec]Cleaning Shifts安排值班
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 45 Solved: ...
- BZOJ 3389: [Usaco2004 Dec]Cleaning Shifts安排值班
题目 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MB Description ...
- 3389: [Usaco2004 Dec]Cleaning Shifts安排值班
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 102 Solved: ...
- USACO 1.3.2 Barn Repair 修理牛棚(贪心)
Description 在一个夜黑风高,下着暴风雨的夜晚,农民约翰的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 剩下的牛一个紧挨着另一个被排成一行来过夜. 有些牛棚里有牛,有些没 ...
随机推荐
- scrapy-redis + Bloom Filter分布式爬取tencent社招信息
scrapy-redis + Bloom Filter分布式爬取tencent社招信息 什么是scrapy-redis 什么是 Bloom Filter 为什么需要使用scrapy-redis + B ...
- jquery判断对象是undifined,判断对象是null
判断对象是undifined: var aaa = undefined; if (typeof(aaa) == "undefined") { ... } typeof 返回的是字符 ...
- TCP之1460MSS和1448负载
TCP和1448 1448字节是实际场景下,单个TCP包的实际运载能力.也就是说,实际场景下,上层调用send(1000KB),下层会把这1000KB封装成多个TCP包进行发送.单个TCP包每次打包1 ...
- RTC, Real Time Clock
配置 写入RTC_PRL, RTC_CNT, RTC_ALR寄存器时,需要先进入配置模式,通过把RTC_CRL寄存器的CNF位置一. 另外,在每次配置一个寄存器时必须等待上一次配置完成,可以通过检测R ...
- POJ2406-Power Strings-KMP循环节/哈希循环节
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...
- Codeforces 479【F】div3
题目链接:http://codeforces.com/problemset/problem/977/F 题意:给你一串数字序列,让你求最长上升子序列,但是这个子序列呢,它的数字得逐渐连续挨着. 题解: ...
- JS对象 Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒)。 定义一个时间对象 : var Udate=new Date();Date()的首字母须大写
Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义一个时间对象 : var Udate=new Date(); 注意:使用关键字new,Date()的首 ...
- await和async
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Docker 尝试安装rabbitmq实践笔记
docker pull rabbitmq 自定義的rabbitmq Dockerfile # base image FROM rabbitmq:3.7-management # running req ...
- yii2中使用定义在 params.php文件中的配置
yii2 使用 配置文件中在 params 的配置, 可以用 Yii::$app->params['key1']形式访问 参考 yii can't access Yii::$app->pa ...