第十届蓝桥杯省赛C++B组 组队
试题 A:组队
本题总分:5 分
【问题描述】
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。
每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少?
(如果你把以上文字复制到文本文件中,请务必检查复制的内容是否与文 档中的一致。在试题目录下有一个文件 team.txt,内容与上面表格中的相同, 请注意第一列是编号)
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
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
答案:490
方法一:暴力解决一切
思路:一列一列的遍历,要用剪枝删掉不合理的情况
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct player
{
int no;
int a, b, c, d, e;
};
int main()
{
player team[20];
for (int i = 0; i < 20; i++)
{
cin >> team[i].no>>team[i].a >> team[i].b >> team[i].c >> team[i].d >> team[i].e;
}
int ans = 0;
for (int i = 0; i < 20; i++)
{
if (team[i].a == 0)
{
continue;
}
for (int j = 0; j < 20; j++)
{
if (team[j].b == 0||j==i)
continue;
for (int k = 0; k < 20; k++)
{
if (team[k].c == 0||k==i||k==j)
continue;
for (int m = 0; m < 20; m++)
{
if (team[m].d == 0 || m == i || m == j || m == k)
continue;
for (int n = 0; n < 20; n++)
{
if (team[n].e == 0 || n == i || n == j || n == k || n == m)
continue;
int sum = team[i].a + team[j].b + team[k].c + team[m].d + team[n].e;
if (sum > ans)
ans = sum;
}
}
}
}
cout << ans;
system("pause");
return 0;
}
}
方法二:深度优先遍历(dfs)
思路:从第一列往第五列深度遍历,见代码~
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
#define N 20
#define M 6
int a[N][M];
int b[M], maxi;//maxi是全局变量,对dfs很关键
void dfs(int cur, int sum)
{
if (cur == M)
{
if (maxi <= sum)
{
maxi = sum;
cout << sum << " " << "list:";
for (int i = 1; i < M; i++)
{
cout << b[i] + 1 << " ";
}
cout << endl;
}
}
else
{
for (int i = 0; i < N; i++)
{
bool ok = true;
for (int j = 1; j < cur; j++)
{
if (b[j] == i)
{
ok = false;
break;
}
}
if (ok)
{
b[cur] = i;
dfs(cur + 1, sum + a[i][cur]);
}
}
}
}
int main()
{
for (int i = 0 ;i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> a[i][j];//注意这里也把编号存在了a[i]列
}
}
dfs(1, 0);//从一号位开始,第一个参数是位置,第二个参数是得分和
system("pause");
return 0;
}