訓練題 拔河比賽

2021-07-16 06:34:14 字數 1786 閱讀 8596

【問題描述】

學校決定舉行一次全校性的拔河比賽,以班為單位組隊。我們知道影響拔河比賽勝負的因素有:參賽隊的合力量、總重量和技巧。如果每只隊伍的人數都一樣的話,那麼低年級的班級會沒有獲勝的希望。因此學校考慮到比賽公平性和參與的廣泛性,做出如下規定:

◆ 每只隊伍的人數不一定相同,但隊員的總重量不能超過某個規定的值。

◆ 每只隊伍的女隊員必須達到一定的人數。

多多是高二x班的體育委員,班主任將本班組隊的任務交給了他。多多深知影響比賽勝敗的三個關鍵因素中力量和重量是前提,技巧靠後期訓練。因此他必須先考慮在學校規定的前提下,選那些同學才能獲得最大的合力量。

【輸入格式】

第一行3個數整數:分別表示隊員總重量上限w(<=4000)、多多班上學生總人數n(<=60)、女同學人數m(<=30);

第2行乙個整數,表示參賽隊中必須達到的女隊員人數k(<=10);

接下來n行每行2個整數,分別表示多多班上每個同學的重量和力量,其中第3到m+2行是所有女生的重量和力量,第m+3到n+2行表示所有男同學的重量和力量,每個整數在60至180之間。

【輸出格式】

一行乙個整數,合力量的最大值。

【輸入樣例】

400 10 3

2 90 120

80 90

100 150

110 80

150 100

120 80

90 80

80 70

120 100

110 90

【輸出樣例】

【資料範圍】

共10組測試資料:(每組測試正確得10分,共100分)

對於前3組資料有n<=20、m<=10、w<=1000;

對於前5組資料有n<=30、m<=15、w<=2000;

對於前10組資料有n<=60、m<=25、w<=4000;

【題解】

窮舉 + 0/1揹包類的動態規劃

動態規劃計算,從m個女生中選擇至少k個女生,體重和不超過t的情況下所能獲得的最大力量:p1

動態規劃計算,從n-m個男生中選擇一些,體重和不超過w-t的情況下所能獲得的最大力量:p2

女 d1:設定狀態函式f(m,k,w)=前m個女生,選擇k個女生,在體重和不超過w的情況下,所能得到的最大力量和(可用滾動陣列)

男 d2:設定狀態函式f(n,w)=前n個男生中選擇一些,在體重和不超過w的情況下,所能得到的最大力量和(可用滾動陣列)

把女生和男生分開來分析:

隊伍的體重和不超過w,把這個w分成兩部分:女生體重和不超過t,男生體重和不超過w-t,因此可以窮舉t,然後p1、p2呼叫生成好的d1、d2。

#include

#include

#define maxn 2000

#define oo 1000000000

using

namespace

std;

int w,n,m,k,x,y,ans=-oo;

int gw[maxn],gp[maxn],bw[maxn],bp[maxn];

int girl[50][50][4005]=,boy[65][4005]=;

void read(int &x)

}void in()

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

}void ****1()

}void ****2()

}void task()

printf("%d",ans);

}int main()

code vs拔河比賽

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 檢視執行結果 乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。輸入描述 input description 資料的第1行...

拔河比賽 DP

description 乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。input 輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n 100,接下來的n行表示第1到第n個人的體重,每個人的...

DP 拔河比賽

乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。input 輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n 100,接下來的n行表示第1到第n個人的體重,每個人的體重都是整數 1 wei...