在乙個籃球聯賽裡,有n支球隊,球隊的支出是和他們的勝負場次有關係的,具體來說,第i支球隊的賽季總支出是ci*x^2+di*y^2,di<=ci。(贏得多,給球員的獎金就多嘛),
其中x,y分別表示這只球隊本賽季的勝負場次。現在賽季進行到了一半,每只球隊分別取得了a[i]場勝利和b[i]場失利。而接下來還有m場比賽要進行。問聯盟球隊的最小總支出是多少。
費用流同bzoj1449
#include#include#include
#include
#include
using
namespace
std;
struct
node
}a[110000];int len,last[6100
];void ins(int x,int y,int c,int
d)int
st,ed;
int list[6100
];int d[6100
];bool v[6100
];int
ans;
int pos[6100],pre[6100
];bool
spfa()}}
head++;
v[x]=false
; }
if(d[ed]==999999999) return
false
;
else
return
true;}
int w[5100],l[5100],c[5100],d[5100
];void
flow()
}}int s[5100
];int
main()
for(int i=1;i<=n;i++) ans+=c[i]*w[i]*w[i]+d[i]*l[i]*l[i];
//c[i]*2*w[i]+c[i]-d[i]*2*l[i]+d[i]
for(int i=1;i<=n;i++)
}flow();
printf(
"%d\n
",ans);
return0;
}
BZOJ1449 球隊收益
乙個整數表示聯盟裡所有球隊收益之和的最小值。3 31 0 2 1 1 1 10 1 0 1 3 3 1 22 3 3 1我們先假設所有的球隊都贏,算出答案。然後每場比賽都要提供乙個輸的場次。考慮費用流。源點向每場比賽連邊,每場比賽向兩隻隊伍連邊,隊伍再向匯點連邊。注意到乙隻隊伍的得分是關於輸的場次的...
JSOI2009 bzoj1449 球隊收益
description input output 乙個整數表示聯盟裡所有球隊收益之和的最小值。首先假設全輸,然後給每場比賽分配乙個贏家,每個隊伍每多贏一場多獲得的收益作為費用。但是有乙個問題,如何保證每次走的是對應的邊?也就是,如何保證贏第一場的時候增加的收益是贏一場減贏零場,而不是贏兩場減贏一場?...
bzoj1449 JSOI2009 球隊收益
傳送門 感覺就是費用流呀。可以發現這道題與之前的費用流題有所不同,因為乙個球隊不論輸還是贏都會獲得收益。這裡就要用到乙個技巧,我們可以假裝比賽雙方都輸,然後修改贏的就ok辣。然後就是每個人向終點連邊,這裡的費用隨著流量的變化而變化,所以我們要用到拆邊法。考慮乙個人從贏win i 次 輸lose i ...