终于自己独立做出来一道题QAQ然而本校数据实在太水不能确定我是不是写对了。。。

原题:

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

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

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

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

刚学网络流来看着道题的时候感觉根本没思路啊,现在再回来看已经能解决掉了(也许是数据实在太水……

要求使最大值与最小值的差最小,有点二分的意思?,因为郁闷值的范围很小(1-n)所以可以枚举最小的,二分最大的

然后根据枚举和二分出的两个值建图,源到每头牛流量1,设a[i][j]为第i头牛郁闷值为j的房间,x为枚举的最小,y为二分的最大,第i头牛就与a[i][x~y]流量为1,每个房间到汇流量为房间容量

然后跑最大流,如果能跑到满流,说明方案合法继续二分

数据太水,不好验证这样做是否正确,应该是正确的吧= =

终于自己做出来一道题了好开心OvO

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
const int oo=;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct ddd{int y,v,re;}; vector <ddd> e[];
inline void ist(int x,int y,int z){
e[x].push_back((ddd){y,z,e[y].size()});
e[y].push_back((ddd){x,,e[x].size()-});
}
int n,m,a[][],b[]; int s,t;
int ans=oo;
int lvl[];
int q[],hd=;
void otmp(int x){
cout<<x<<endl;
for(int i=;i<e[s].size();++i) cout<<s<<"->"<<e[s][i].y<<" "<<e[s][i].v<<endl;
for(int i=;i<=n;++i)for(int j=;j<e[i].size();++j)if(e[i][j].y>n)
cout<<i<<"->"<<e[i][j].y-n<<" "<<e[i][j].v<<endl;
for(int i=;i<=m;++i)for(int j=;j<e[i].size();++j)if(e[i][j].y==t)
cout<<i<<"->"<<t<<" "<<e[i][j].v<<endl;
}
bool gtlvl(){
memset(lvl,,sizeof(lvl));
q[hd=]=s,lvl[s]=;
int x,sz;
for(int k=;k<=hd;++k){
x=q[k],sz=e[x].size();
for(int i=;i<sz;++i)if(e[x][i].v && !lvl[e[x][i].y])
lvl[e[x][i].y]=lvl[x]+,q[++hd]=e[x][i].y;
}
return lvl[t];
}
int agmt(int x,int y){
if(x==t) return y;
int mxflw=,flw,sz=e[x].size();
for(int i=;i<sz && mxflw<y;++i)if(lvl[e[x][i].y]==lvl[x]+)
if(flw=agmt(e[x][i].y,min(y-mxflw,e[x][i].v))){
mxflw+=flw;
e[x][i].v-=flw,e[e[x][i].y][e[x][i].re].v+=flw;
}
if(!mxflw) lvl[x]=;
return mxflw;
}
int dnc(){
int bwl=,flw;
while(gtlvl())while(flw=agmt(s,oo)){
//otmp(flw);
bwl+=flw;
}
return bwl;
}
bool chck(int x,int y){
for(int i=s;i<=t;++i) e[i].clear();
for(int i=;i<=m;++i) ist(i+n,t,b[i]);
for(int i=;i<=n;++i) ist(s,i,);
for(int i=;i<=n;++i)for(int j=x;j<=y;++j)
ist(i,a[i][j]+n,);
//otmp(y-x+1+1000);
return dnc()==n;
}
int bnrsch(int x){
int l=,r=m-x,md;
if(!chck(x,x+r)) return oo;
while(l+<r){
md=(l+r)>>;
(chck(x,x+md)?r:l)=md;
}
return (chck(x,x+l)?l:r)+;
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n>>m; s=,t=n+m+;
for(int i=;i<=n;++i)for(int j=;j<=m;++j) a[i][j]=rd();
for(int i=;i<=m;++i) b[i]=rd();
for(int i=;i<=m;++i) ans=min(ans,bnrsch(i));
cout<<ans<<endl;
return ;
}

【usaco 2006 feb gold】 牛棚安排的更多相关文章

  1. [USACO 2018 Feb Gold] Tutorial

    Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...

  2. USACO 2006 November Gold Corn Fields

    USACO 2006 November Gold Corn Fields 题目描述: Farmer John has purchased a lush new rectangular pasture ...

  3. [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...

  4. BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution

    权限题,不给传送门啦!在学校OJ上交的.. 有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀. 正经题解: 首先,我们可以由「显然成立法」得出, ...

  5. USACO 2006 November Gold

    POJ 3253 Fence Repair STL堆操作 我想说,STL里堆是我目前见到最蛋疼的操作. #include <cstdio> #include <cstring> ...

  6. BZOJ1579 USACO 2009 Feb Gold 3.Revamping Trails Solution

    标题效果:一个N积分m无向图边.它可以是路径k右边缘值变0,确定此时1-n最短路径长度. Sol:我以为我们考虑分层图,图复制k+1部分,每间0~k一层.代表在这个时候已经过去"自由边缘&q ...

  7. bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch

    Description 就像人类喜欢玩"跳房子"的游戏,农民约翰的奶牛已经发明了该游戏的一个变种自己玩.由于笨拙的动物体重近一吨打,牛跳房子几乎总是以灾难告终,但这是没有阻止奶牛几 ...

  8. BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap

    题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...

  9. USACO 2017 FEB Gold visitfj 最短路

    题意 有一幅n*n的方格图,n <= 100,每个点上有一个值.从(1,1)出发,走到(n,n),只能走四联通.每走一步花费t,每走三步需要花费走完三步后到达格子的值.求最小花费的值. 拆点,d ...

随机推荐

  1. python if elif else判断语句

    username = 'jack' password = ' _username = input('username') _password = input('password') if userna ...

  2. 四. Python基础(4)--语法

    四. Python基础(4)--语法 1 ● 比较几种实现循环的代码 i = 1 sum = 0 while i <= 10: # 循环10-1+1=10次     sum += i     i ...

  3. 第三篇 功能实现(3) (Android学习笔记)

    第三篇 功能实现(3) ●发一个广播和启动一个隐式的Intent非常像,那么它们之间有什么区别呢? Implicit Intents (sent via startActivity( )) and B ...

  4. 第一篇 入门必备 (Android学习笔记)

    第一篇 入门必备 第1章 初识Android 第2章 搭建你的开发环境 第3章 创建第一个程序--HelloWorld 第4章 使用Android工具   ●Android之父 Android安迪·罗 ...

  5. 如何使用VSTO自动将Excel中的图表复制到Word

    如何使用VSTO自动将Excel中的图表复制到Word 原文地址:https://code.msdn.microsoft.com/How-to-copy-Chart-in-Excel-a29f9029 ...

  6. 下载hibenate tools插件(百度搜hibenate tools 下载)

    Eclipse插件的安装和使用1.     在线更新( http://blog.csdn.net/charlies_fu/article/details/5638068)打开eclipse工具,选择H ...

  7. Linux学习 : 移植qt 5.6.3 及 tslib 1.4

    (一) 移植 qt5.6.3 一.qt简介: Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具 ...

  8. HashMap和Hashtable有什么区别?

    HashMap和Hashtable都是实现Map接口的,但是: 1.HashMap允许键和值都是null的,而Hashtable不允许键和值为null 2.Hashtable是同步的,而HashMap ...

  9. tf 版本更新 记录

    tf 经常更新版本,网上教程又是各版本都有,且不标明版本,致使各种用法难以分清哪个新,哪个旧,这里做个记录,以前的博客我就不更新了,请大家见谅. tf.nn.rnn_cell 改为 tf.contri ...

  10. Vue extend 学习

    <div id="box"> <aa></aaa> </div> <script> var Aaa = Vue.exte ...