这是题目大致意思,思路很简单,就是找出每个位置的前五个人把他们的坐标存起来可以有重复的,之后dfs就可以啦时间复杂度n + 5^5;在这里插入代码片
题目描述
JWJU注重培养学生的“唱,跳,rap,篮球”能力。于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台。校赛冠军的奖励是看wls女装一次,为了这个目标,大家都努力训练,希望自己能看到wls女装。
教练mymy手下有 nn 名队员,现在他要挑选 55 人组成一个篮球队来参赛。众所周知,一个篮球队伍有五个不同的位置(控球后卫,得分后卫,小前锋,大前锋,中锋),现在教练mymy给出每名队员在每个位置的能力。
注:如果一个队员作为控球后卫出战,则他只能发挥他的控球后卫的能力值。(其他位置类似)
教练mymy想让你帮忙选择出 55 名队员,分别放置在队伍中的不同位置。求他们组成的队伍的最大能力值之和。
输入描述
输出第一行包含一个正整数 nn (5 \le n \le 10^{5}5≤n≤10
5
)。
接下来包含 nn 行,每行包含 55 个正整数,描述每个队员在每个位置的能力值。每项能力值的取值范围都在 [1,10^{9}][1,10
9
]。
输出描述
输出一行一个正整数代表组成的队伍的最大能力值之和。
样例输入 1
5
10 11 12 15 10
10 15 12 11 10
15 10 15 15 15
19 20 114000 10 300
14 10 155 200 469
样例输出 1
114514
提示
第一个人放在位置4,发挥15的能力值
第二个人放在位置2,发挥15的能力值
第三个人放在位置1,发挥15的能力值
第四个人放在位置3,发挥114000的能力值
第五个人放在位置5,发挥469的能力值
团队总能力值:15+15+15+114000+469=11451415+15+15+114000+469=114514
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
bool vis[N];
ll co[N][6];
ll maxx[6][6];
ll tmp;
void dfs(int now,ll s)
{
if(now == 6)
{
tmp = max(tmp , s);
return ;
}
for(int i = 1;i <= 5;i++)//每种能力的前五个人。
{
if(vis[maxx[i][now]])continue;
vis[maxx[i][now]] = 1;
dfs(now + 1,s + co[maxx[i][now]][now]);
vis[maxx[i][now]] = 0;
}
}
int main()
{
ll n;
cin >> n;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= 5;j++)
{
cin >> co[i][j];
for(int pos = 1;pos <= 5;pos++)
{
if(co[maxx[pos][j]][j] < co[i][j])
{
for(int k = 5;k >= pos + 1;k--) maxx[k][j] = maxx[k-1][j];//maxx的一维存的是第几,二维存的是位置,值为第几个人。
maxx[pos][j] = i;
break;
}
}
}
}
dfs(1,0);
cout << tmp << endl;
}