【usaco 2006 feb gold】 牛棚安排
终于自己独立做出来一道题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】 牛棚安排的更多相关文章
- [USACO 2018 Feb Gold] Tutorial
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...
- USACO 2006 November Gold Corn Fields
USACO 2006 November Gold Corn Fields 题目描述: Farmer John has purchased a lush new rectangular pasture ...
- [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...
- BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution
权限题,不给传送门啦!在学校OJ上交的.. 有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀. 正经题解: 首先,我们可以由「显然成立法」得出, ...
- USACO 2006 November Gold
POJ 3253 Fence Repair STL堆操作 我想说,STL里堆是我目前见到最蛋疼的操作. #include <cstdio> #include <cstring> ...
- BZOJ1579 USACO 2009 Feb Gold 3.Revamping Trails Solution
标题效果:一个N积分m无向图边.它可以是路径k右边缘值变0,确定此时1-n最短路径长度. Sol:我以为我们考虑分层图,图复制k+1部分,每间0~k一层.代表在这个时候已经过去"自由边缘&q ...
- bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch
Description 就像人类喜欢玩"跳房子"的游戏,农民约翰的奶牛已经发明了该游戏的一个变种自己玩.由于笨拙的动物体重近一吨打,牛跳房子几乎总是以灾难告终,但这是没有阻止奶牛几 ...
- BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap
题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...
- USACO 2017 FEB Gold visitfj 最短路
题意 有一幅n*n的方格图,n <= 100,每个点上有一个值.从(1,1)出发,走到(n,n),只能走四联通.每走一步花费t,每走三步需要花费走完三步后到达格子的值.求最小花费的值. 拆点,d ...
随机推荐
- Innodb引擎简介
一.锁 二.什么情况出现阻塞 1.频繁更改的表,出现了慢查询 2.频繁访问的表,出现了备份等(表级锁) 三.查看运行情况 show engine innodb status; 四.关键参数 innod ...
- Android : iperf-2.0.4 网络测试工具
一.源码下载及交叉编译: 下载:https://pan.baidu.com/s/1i6NYDF3 //包含linux和windows上的可执行文件 1. 解压后获得perf-2.0.4源码.2. ...
- loadrunner请求json数据参数化问题
http://blog.sina.com.cn/s/blog_62079f620102vvx3.html
- Linux alias别名命令
首先介绍一下命令的别名,怎么查看的呢? 咱们使用which命令就可以查看的到它完整的命令是怎样的 [root@master ~]# which ls alias ls='ls --color=auto ...
- 源码安装nginx 出现fatal error: pcre.h: 没有此文件或者目录
原因是用了pcre2 重新下载pcre再编译即可.
- 关于Java的特点之封装
抽象 1.简单理解 我们在前面去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模版).这种研究问题的方法称为抽象. 封装--什么是封装 封装就是把抽象出来的数据和对 ...
- SQL--数据表--基本操作
表操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名(字段名字 数据类型,字段名字 数据类型 --最后一行不需要逗号) [表选项] ; if no ...
- 解决Detected problems with API compatibility...
如果是10.3.0那么targetsdk改28.
- Day1作业及默写
1.简述变量命名规范 变量由字母, 数字,下划线搭配组合而成 不可以⽤数字开头,更不不能是全数字 不能是pythond的关键字, 这些符号和字母已经被python占⽤, 不可以更改 不要⽤中文 名字要 ...
- 性能测试-9.Controller功能介绍
Controller功能介绍 设计场景 配置场景 场景监控 一.设计场景 二.配置场景 规划场景(场景名.调度方式.运行方式.Initialize方式.Start Vusers方式.Duration方 ...