2011集訓隊出題 happiness

2021-08-13 23:20:56 字數 2016 閱讀 5386

高一一班的座位表是個n*m的矩陣,經過乙個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。

作為計算機競賽教練的scp大老闆,想知道如何分配可以使得全班的喜悅值總和最大。

第一行兩個正整數n,m。

接下來是六個矩陣

第乙個矩陣為n行m列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學選擇文科獲得的喜悅值。

第二個矩陣為n行m列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學選擇理科獲得的喜悅值。

第三個矩陣為n-1行m列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學與第i+1行第j列的同學同時選擇文科獲得的額外喜悅值。

第四個矩陣為n-1行m列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學與第i+1行第j列的同學同時選擇理科獲得的額外喜悅值。

第五個矩陣為n行m-1列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學與第i行第j+1列的同學同時選擇文科獲得的額外喜悅值。

第六個矩陣為n行m-1列 此矩陣的第i行第j列的數字表示座位在第i行第j列的同學與第i行第j+1列的同學同時選擇理科獲得的額外喜悅值。

輸出乙個整數,表示喜悅值總和的最大值

1 2

1 1

100 110

1 1000

【樣例說明】

兩人都選理,則獲得100+110+1000的喜悅值。

【資料規模】

對於10%以內的資料,n,m<=4

對於30%以內的資料,n,m<=8

對於100%以內的資料,n,m<=100 所有喜悅值均為小於等於5000的非負整數

這一題的建模比較有創意。

考慮建立乙個超級源點s和乙個超級匯點t。

從s連邊到某個點表示選文科,從某個點連邊到t表示選理科,邊權值為給定的喜悅值。

對於兩個點都選文的情況,就新建乙個中間點,從s連到中間點,邊權為喜悅值,再從中間點連向這兩個點,邊權設為inf。

類似的可以處理處理科的情況。

這裡的連邊很關鍵,也不是很好想。

**還是比較好懂的。

#include 

#include

#include

#define p(x,y) (~-(x)*m+(y)) //快速算點座標

#define fo(i,a,b) for (i=a;i<=b;i++)

using namespace std;

const int maxn=500000;

const int inf=10000007;

int n,m,i,j,p,x,tot,ans,s,t,cnt;

intnext[maxn],head[maxn],b[maxn],c[maxn],d[maxn],q[maxn],cur[maxn];

intread()

return su;

}void plus(int

x,int

y,int z)

void add(int

x,int

y,int z)

int bfs()}}

if (d[t]>0) return

1; else

return

0;}

int dfs(int

x,int f)}}

return0;}

int main()

fo(i,1,n)

fo(j,1,m)

fo(i,1,n-1)

fo(j,1,m)

fo(i,1,n-1)

fo(j,1,m)

fo(i,1,n)

fo(j,1,m-1)

fo(i,1,n)

fo(j,1,m-1)

while (bfs())

printf("%d\n",sum-ans);

}

2011集訓隊出題 happiness

description 高一一班的座位表是個n m的矩陣,經過乙個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。作為計算機競賽教練的scp大老闆,想知道如何分...

2011集訓隊出題 拆遷隊

lanxisi帶領著他的拆遷隊來整治乙個街道。這個街道由n個舊房子組成,從左到右編號為1.n。每個舊房子i有乙個正整數的美觀度ai。lanxisi希望整個街道從左到右美觀度嚴格遞增,也就是保證ai i。但是舊的街道明顯不符合這個要求,於是lanxisi希望拆遷一些舊房子並在原地建立新房子來滿足這一要...

2011集訓隊出題 跳跳棋

time limits 1000 ms memory limits 128000 kb description 跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動...