第十屆 藍橋杯軟件類 C或C++程序設計 本科B組 省賽 第1題 組隊

藍橋杯 歷屆真題 題解目錄

試題 A: 組隊

本題總分:5 分
 
【問題描述】
  作爲籃球隊教練,你需要從以下名單中選出 1 號位至 5 號位各一名球員, 組成球隊的首發陣容。
  每位球員擔任 1 號位至 5 號位時的評分如下表所示。請你計算首發陣容 1 號位至 5 號位的評分之和最大可能是多少?
 
編號 1號位 2號位 3號位 4號位 5號位
1 97 90 0 0 0
2 92 85 96 0 0
3 0 0 0 0 93
4 0 0 0 80 86
5 89 83 97 0 0
6 82 86 0 0 0
7 0 0 0 87 90
8 0 97 96 0 0
9 0 0 89 0 0
10 95 99 0 0 0
11 0 0 96 97 0
12 0 0 0 93 98
13 94 91 0 0 0
14 0 83 87 0 0
15 0 0 98 97 98
16 0 0 0 93 86
17 98 83 99 98 81
18 93 87 92 96 98
19 0 0 0 89 92
20 0 99 96 95 81
 
(如果你把以上文字複製到文本文件中,請務必檢查複製的內容是否與文 檔中的一致。
  在試題目錄下有一個文件 team.txt,內容與上面表格中的相同, 請注意第一列是編號)
 
【答案提交】
  這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果爲一 個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

答案:490
 
分析:
  行就是每個人,列就是每個人對應位置的分數。
  和皇后問題差不多,標記行和列,每行即每個人只能出一個位置,每列即每個位置只能由一個人來參加。
  標記完直接dfs深搜回溯吧。
  我加了一個對於這題很有用的剪枝條件,就是arr[i][j] !=0arr[i][j]\ !=0,這樣就能篩選掉很多的數據啦~
  
代碼如下:

#include <iostream>
#include <algorithm>
using namespace std;

int arr[20][5];

int r[20] = { 0 };
int c[5] = { 0 };
int ans = 0;

void dfs(int count, int sum)
{
	if (count == 5)
	{
		ans = max(ans, sum);
		return;
	}

	for (int i = 0; i < 20; i++)
	{
		if (r[i]) continue;
		r[i] = 1;
		for (int j = 0; j < 5; j++)
		{
			if (c[j] || arr[i][j] == 0) continue;
			c[j] = 1;
			dfs(count + 1, sum + arr[i][j]);
			c[j] = 0;
		}
		r[i] = 0;
	}
}

int main()
{
	freopen("text.ini", "r", stdin);

	for (int i = 0; i < 20; i++)
	{
		for (int j = 0; j < 5; j++)
			cin >> arr[i][j];
	}

	dfs(0, 0);

	cout << ans << endl;

	cout << "over" << endl;
	while (1);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章