题目

Description

Farmer John的N(1<=N<=1000)头奶牛分别居住在农场所拥有的B(1<=B<=20)个牛棚的某一个里。有些奶牛很喜欢她们当前住的牛棚,而另一些则讨厌再在它们现在所在的牛棚呆下去。
FJ在忍受了若干次奶牛的抱怨后,决定为所有奶牛重新安排牛棚,使最不满的那头奶牛与最高兴的奶牛的心情差异最小,即使这会让所有奶牛都更加郁闷。
每头奶牛都把她对各个牛棚的好感度从高到低排序后告诉了FJ。当然,如果一头奶牛被安排到的牛棚在她给出的列表中越靠后,她就会越郁闷。你可以认为奶牛的郁闷指数是她被分配到的牛棚在列表中的位置。奶牛们是斤斤计较的,她们无法容忍别的奶牛在自己喜欢的牛棚里快乐地生活,而自己却呆在一个自己不喜欢的牛棚里。每个牛棚都只能容纳一定数量的奶牛。FJ希望在每个牛棚都没有超出容量限制的前提下,使最郁闷和最高兴的奶牛的郁闷指数的跨度最小。 
FJ请你帮他写个程序,来计算这个最小的郁闷指数跨度到底是多少。

Input

第1行: 包含2个用空格隔开的整数N和B,分别表示牛和牛棚的数量
第2..N+1行: 每行包含B个用空格隔开的整数,刚好完全包含1..B的整数。第i+1行的第一个整数,表示奶牛i最喜欢的牛棚编号。第二个整数表示奶牛i的列表中排在第二位,也就是她第二喜欢的牛棚。依此类推。
第N+2行: 包含B个用空格隔开的整数,第i个整数表示牛棚i最多能容纳的奶牛的数目。所有牛棚能容纳奶牛头数的和至少是N。 

Output

第1行: 输出一个整数,表示所有奶牛中最高兴与最郁闷的牛的郁闷指数跨度

Sample Input

6 4
1 2 3 4
2 3 1 4
4 2 3 1
3 1 2 4
1 3 4 2
1 4 2 3
2 1 3 2

Sample Output

2

Data Constraint

Hint

【样例说明】
每头奶牛都能被安排进她的第一或第二喜欢的牛棚。下面给出一种合理的分配方案:奶牛1和奶牛5住入牛棚1,牛棚2由奶牛2独占,奶牛4住进牛棚3,剩下的奶牛3和奶牛6安排到牛棚4。

分析

二分答案加网络流

我边上加多一个忧郁值,如果我忧郁值大于当前枚举就不能流

代码

 1 #include<iostream>
 2 #include<queue>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 const int N=1e3+10;
 7 const int B=21;
 8 const int inf=2147483647;
 9 int s,t,l;
10 int n,b,ans;
11 int cnt=1,mid;
12 int a[10001];
13 int dis[10001];
14 int list[110001];
15 struct node {
16     int u,v,c,w,nx;
17 }g[2*N*B+2*N+2*B];
18 void add(int u,int v,int w,int c) {
19     g[++cnt]=(node){u,v,c,w,list[u]};list[u]=cnt;
20     g[++cnt]=(node){v,u,0,0,list[v]};list[v]=cnt;
21 }
22 bool bfs()
23 {
24     queue<int> q;
25     while(!q.empty()) q.pop();
26     memset(dis,0,sizeof(dis));
27     q.push(s);
28     dis[s]=1;
29     while (!q.empty())
30     {
31         int x=q.front(); q.pop();
32         for (int i=list[x];i;i=g[i].nx)
33         {
34             int y=g[i].v;
35             if (g[i].c&&!dis[y]&&(l<=g[i].w&&g[i].w<=l+mid-1||g[i].w==0))
36             {
37                 dis[y]=dis[x]+1;
38                 if (y==t) return 1;
39                 q.push(y);
40             }
41         }
42     }
43     return 0;
44 }
45 int dfs(int x,int maxf)
46 {
47     if (x==t) return maxf;
48     int ret=0;
49     for (int i=list[x];i;i=g[i].nx)
50     {
51         int y=g[i].v;
52         if (g[i].c&&dis[y]==dis[x]+1&&(l<=g[i].w&&g[i].w<=l+mid-1||g[i].w==0))
53         {
54             int f=dfs(y,min(g[i].c,maxf-ret));
55             if (!f) dis[y]=-1;
56             g[i].c-=f;
57             g[i^1].c+=f;
58             ret+=f;
59             if (ret==maxf) return ret;
60         }
61     }
62     return ret;
63 }
64 bool dinic()
65 {
66     int flow;
67     for (l=1;l<=max(1,b-mid+1);l++)
68     {
69         flow=0;
70         while (bfs())
71            flow+=dfs(s,inf);
72         for (int i=2;i<=cnt;i+=2)
73            if (g[i].u==s) g[i].c=a[g[i].v],g[i^1].c=0;
74            else g[i].c=1,g[i^1].c=0;
75         if (flow==n) return 1;
76     }
77     return 0;
78 }
79 int main ()
80 {
81     cin>>n>>b;
82     s=0,t=n+b+1;
83     for (int i=1;i<=n;i++)
84        for (int j=1,c;j<=b;j++)
85        {
86              cin>>c;
87              add(c,i+b,j,1);
88        }
89     for (int i=1;i<=b;i++) scanf("%d",&a[i]),add(s,i,0,a[i]);
90     for (int i=1;i<=n;i++) add(i+b,t,0,1);
91     int l=1,r=20;
92     while (l<=r)
93     {
94         mid=l+r>>1;
95         if (dinic()) ans=mid,r=mid-1;
96         else l=mid+1;
97     }
98     cout<<ans;
99 }

转载于:https://www.cnblogs.com/zjzjzj/p/11135109.html

JZOJ 1259. 牛棚安排相关推荐

  1. 【最大流】牛棚安排(jzoj 1259)

    牛棚安排 jzoj 1259 题目大意: 有nnn头牛和mmm个牛棚,每头牛有自己第1喜欢,第2喜欢--第mmm喜欢的牛棚(开心度分别为m,m−1,m−2--1m,m-1,m-2--1m,m−1,m− ...

  2. 纪中B组模拟赛总结(2019.12.21)

    (因为是两人一号,所以不方便显示成绩就不打了) 总结: 今天竟有四道题!!! T1看过之后,想了大概10分钟然后想了出来,就是一个单调栈,不算特别难 T2一开始想到大模拟,但是下坡的情况没法处理,后来 ...

  3. 【2019暑假集训】07.07比赛总结

    今天周末,没有比赛,随便做了一些题目 解题思路 2019.07.04[NOIP提高组]模拟 A 组 T1(非回文数字):数位DP T2(管道):环套树+解方程 T3(牛棚安排):网络流 T4([07. ...

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

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

  5. poj 2376 bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班(贪心)

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

  6. bzoj 3405: [Usaco2009 Open]Grazing2 移动牛棚(DP)

    3405: [Usaco2009 Open]Grazing2 移动牛棚 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 55  Solved: 32 [ ...

  7. USACO1996《修理牛棚》解题报告

    Barn Repair 修理牛棚 译 by tim green 在一个暴风雨的夜晚,农民约翰的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 剩下的牛一个紧挨着另一个被排成一行来过夜 ...

  8. 修理牛棚 贪心 USACO

    今天开始终于可以刷USACO的题啦 准备每一道都发一个题解 1010: 1.3.2 Barn Repair 修理牛棚 时间限制: 1 Sec  内存限制: 128 MB 提交: 9  解决: 7 [提 ...

  9. JZOJ(中山纪念中学) 2018.02.02【NOIP普及组】模拟赛D组

    本次题目:2018.02.02[NOIP普及组]模拟赛D组 第一题 题目:第一题 公牛数字 题意: 求题目给出两个数字的乘积 分析: 这题明显只是考察学生的高精可我居然没做对,只要多练习几次,即可AC ...

  10. 做好自己,一切都是最好的安排

    在这个世界上,每个人都有自己的想法.做法.活法:理念不同,做法不同,活法就不同.不同层次的人,有不同层次的表现:不要去改变别人,做好自己一切都是最好的安排. 在生活中,我们难免会遇到各式各样的人:单纯 ...

最新文章

  1. UVA11992不错的线段树段更新
  2. Node.js、Npm、MVVM模式、idea的vue集成
  3. 计算机视觉实验数学形态学,计算机视觉形态学边缘检测.doc
  4. kubevirt在360的探索之路(k8s接管虚拟化)
  5. 摩托罗拉edge X30屏下版真机首曝:四边等宽 屏下显示效果出众
  6. FPDF中文应用攻略
  7. DXUT框架剖析(9)
  8. NetBeans Support Weblog
  9. python实现自动打电话软件_python 实现手机自动拨打电话的方法(通话压力测试)
  10. 支持python的云虚拟主机_云虚拟主机运行python(能运行python的主机)
  11. 基于JavaEE的办公OA系统的设计与实现
  12. 数据分析学习总结笔记06:T检验的原理和步骤
  13. 告别纸质化办公,OA系统为企业节能提效
  14. jquery移除数组中的某个元素
  15. 计算机制图员主要学什么,计算机辅助设计绘图员高级绘图员(机械类)考试说明...
  16. cesium camera相机系统
  17. python京东自动签到领金豆_基于Python+Appium实现京东双十一自动领金币功能
  18. 农村承包土地调查数据库规范(试行)
  19. 通过gae访问android官方文档
  20. 计算机专业报考广东哪所学校,广东哪些大学有人工智能专业

热门文章

  1. 没有方案你抱怨;有了方案你会认真看吗?
  2. 全网首发:以字型为例,以bit表示的二维数组矩阵,旋转90、-90
  3. 管理感悟:软件公司不加班还搞什么软件
  4. VisualStudio VC redist各版本下载链接
  5. Gradle sync failed: Unsupported method: NativeArtifact.getSourceFolders().
  6. NWT失败反省:不想办法开展业务,天天想着让别人不能用
  7. ckc交易什么意思_期货交易中的标准仓单充抵保证金是什么意思?
  8. python中debug有什么用途_python中调试或排错的五种方法示例
  9. java xlsx读写_java中怎样从Excel中读写数据
  10. Arduino 函数-IO输出输入