穩定的奶牛分配
time limit:10000ms memory limit:65536k
total submit:53 accepted:23
case time limit:1000ms
description
農夫約翰有n(1<=n<=1000)只奶牛,每只奶牛住在b(1<=b<=20)個奶牛棚中的乙個。當然,奶牛棚的容量有限。有些奶牛對它現在住的奶牛棚很滿意,有些就不太滿意了。
農夫約翰想要重新安排這些奶牛,使得奶牛的滿意度盡可能相同,儘管有可能這意味者所有的奶牛都不喜歡新分配的奶牛棚。
每只奶牛都按順序給出她喜歡的奶牛棚。在某個分配方案中,乙隻奶牛的滿意度等於她對她的奶牛棚的評價等級。你的工作是找出一種分配方案使得沒有奶牛棚超出它的容量,而且奶牛給分配到的奶牛棚的評價等級的相對範圍(即分配到的等級最高的奶牛棚和等級最低的奶牛棚之間的差值)盡可能的小。
input
第1行:兩個用空格隔開的整數,n和b
第2..n+1行:每一行都有b個用空格隔開的正整數,它們恰好是1到b的乙個排列。第i+1行的第乙個整數是第i只奶牛的首選牛棚的編號,該行的第二個整數是第i只奶牛的第二選擇,等等。
第n+2行:b個用空格隔開的整數,分別表示這b個奶牛棚的容量。這些數的和保證至少為n。
output
乙個整數,被分配到的牛棚等級的最小相對差值,輸出得到該相對差時所包含的不同等級的牛棚個數。
sample input
6 41 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
hint
每個奶牛都被安排在它的第一選擇或第二選擇:1號牛棚安排1號奶牛和5號奶牛,2號牛棚安排2號奶牛,3號牛棚安排4號奶牛,4號牛棚安排3號奶牛和6號奶牛。
輸出樣例
表示得到最小相對差為1,這時奶牛們入住進了兩種不同等級的牛棚
source
網路流 usaco feb06 gold
這道題我們很容易就能想到構圖的方法:
源點連線每乙個奶牛,權值為1,每乙個奶牛連線每乙個牛棚,權值為1,牛棚連線匯點,權值為牛棚容量。
那麼我們怎麼得到答案呢?
首先先列舉答案(這裡可以用二分也可以直接迴圈列舉),然後再列舉牛棚的最高等級(我們設1為最高等級)
最後對於每乙個列舉的物件跑一次sap就可以了
#include#include#includeusing namespace std;
const int inf=1e9,maxn=2005;
int n,b,op,ed,m=2,p[maxn],cow[maxn][maxn],g[maxn][maxn];
int dis[maxn],vd[maxn];
void _read(int &xx)
int dfs(int u,int flow)
if(dis[op]>=ed)return delta;
vd[dis[u]]--;
if(vd[dis[u]]==0)dis[op]=ed;
dis[u]++;
vd[dis[u]]++;
return delta;
}int main(){
int i,j,k,ans;
scanf("%d%d",&n,&b);
op=n+b+1,ed=op+1;
for(i=1;i<=n;i++)
for(j=1;j<=b;j++)
_read(cow[i][j]);
for(i=1;i<=b;i++)_read(p[i]);
for(ans=0;ans
題解 奶牛的聚會(三分)
三分思路詳解 題目描述 農曆新年馬上就要到了,奶牛們計畫舉辦一次聚會慶祝新年的到來。但是,奶牛們並不喜歡走太遠的路,這會給他們的聚會帶來消極情緒,當一頭奶牛的消極指數為wi,他參加聚會所需行走的距離為si,那麼他就會給聚會帶來si3 wi的消極情緒。所有奶牛所在位置都在一條直線上,已知所有奶牛的座標...
進擊的奶牛(二分查詢)
farmer john建造了乙個有n 2 n 100,000 個隔間的牛棚,這些隔間分布在一條直線上,座標是x1,xn 0 xi 1,000,000,000 他的c 2 c n 頭牛不滿於隔間的位置分布,它們為牛棚裡其他的牛的存在而憤怒。為了防止牛之間的互相打鬥,farmer john想把這些牛安置...
進擊的奶牛 二分用法
題目描述 farmer john建造了乙個有n 2 n 100,000 個隔間的牛棚,這些隔間分布在一條直線上,座標是x1,xn 0 xi 1,000,000,000 他的c 2 c n 頭牛不滿於隔間的位置分布,它們為牛棚裡其他的牛的存在而憤怒。為了防止牛之間的互相打鬥,farmer john想把...