BZOJ3442 學習小組

2021-07-26 05:23:40 字數 1581 閱讀 7330

【背景】

坑校準備鼓勵學生參加學習小組。

【描述】

共有n個學生,m個學習小組,每個學生有一定的喜好,只願意參加其中的一些學習小組,但是校領導為學生考慮,規定乙個學生最多參加k個學習小組。財務處的大叔就沒那麼好了,他想盡量多收錢,因為每個學生參加學習小組都要交一定的手續費,不同的學習小組有不同的手續費。然而,事與願違,校領導又決定對學習小組組織者進行獎勵,若有a個學生參加第i個學習小組,那麼給這個學習小組組織者獎勵ci*a^2元。在參與學生(而不是每個學習小組的人數總和)盡量多的情況下,求財務處最少要支出多少錢(若為負數,則輸出負數)(支出=總獎勵費-總手續費)。

輸入有若干行,第一行有三個用空格隔開的正整數n、m、k。接下來的一行有m個正整數,表示每個ci。第三行有m個正整數,表示參加每個學習小組需要交的手續費fi。再接下來有乙個n行m列的矩陣,表若第i行j列的數字是1,則表示第i個學生願意參加第j個學習小組,若為0,則為不願意。

輸出只有乙個整數,為最小的支出。

3 3 1

1 2 3

3 2 1

111111

111-2

【樣例解釋】

參與學生最多為3,每個學生參加乙個學習小組,若有兩個學生參加第乙個學習小組,乙個學生參加第二個學習小組(一定要有人參加第二個學習小組),支出為-2,可以證明沒有更優的方案了。

【資料範圍與約定】

100%的資料,0<n≤100,0<m≤90,0<k≤m,0<ci≤10,0<fi≤100。

費用流

人數這個限制挺坑的,方法是每個人向t連一條(k-1,0)的邊

然後就是喜聞樂見的拆邊

#includeusing namespace std;

const int maxn=200;

const int maxm=100010;

const int inf=1e9;

struct edge

e[maxm];

int n,s,t,ans;

int cnt=1,head[maxn],q[maxn],dis[maxn];

bool vis[maxn];

inline void addedge(int x,int y,int flow,int cost)

inline bool spfa()

} return dis[s]!=inf;

}int dfs(int x,int flow)

return used;

}inline int zkw()

} return tmp;

}int k, m, c[maxn], f[maxn];

char ch[101];

inline int id(int x, int y)

int main()

for( int i = 1 ; i <= m ; i++ )

for( int j = 1 ; j <= n ; j++ )

addedge( i + n, t, 1, ( 2 * j - 1 ) * c[ i ] - f[ i ] );

zkw();

cout << ans << endl;

}

BZOJ3442 學習小組

先不考慮他讓參與人數最多,我們可以s連每個 量k費用0,每個人連能去的小組,流量1費用手續費,小組連t,拆邊建費用 考慮讓參與人數最多,每個人連t流量k 1費用為0,意義是在他參加了社團的情況下他可以把加入社團的機會讓給別的沒有社團的人 include include include include...

bzoj3442 學習小組

題目大意 共有n個學生,m個學習小組,每個學生只願意參加其中的一些學習小組,但校領導規定乙個學生最多參加k個學習小組。每個學生參加學習小組都要交一定的手續費,不同的學習小組有不同的手續費。然而若有a個學生參加第i個學習小組,那麼就要給這個學習小組組織者獎勵ci a 2元。在參與學生 而不是每個學習小...

bzoj3442 學習小組

time limit 5 sec memory limit 128 mb submit 200 solved 87 submit status discuss 背景 坑校準備鼓舞學生參加學習小組。描寫敘述 共同擁有n個學生,m個學習小組,每乙個學生有一定的喜好,僅僅願意參加當中的一些學習小組,可是校...