第十届蓝桥杯省赛C++B组 组队

第十届蓝桥杯省赛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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43535668/article/details/109023466