题目描述
JWJU注重培养学生的“唱,跳,rap,篮球”能力。于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台。校赛冠军的奖励是看wls女装一次,为了这个目标,大家都努力训练,希望自己能看到wls女装。
教练mymymy手下有 nnn 名队员,现在他要挑选 555 人组成一个篮球队来参赛。众所周知,一个篮球队伍有五个不同的位置(控球后卫,得分后卫,小前锋,大前锋,中锋),现在教练mymymy给出每名队员在每个位置的能力。
注:如果一个队员作为控球后卫出战,则他只能发挥他的控球后卫的能力值。(其他位置类似)
教练mymymy想让你帮忙选择出 555 名队员,分别放置在队伍中的不同位置。求他们组成的队伍的最大能力值之和。
提示
第一个人放在位置4,发挥15的能力值
第二个人放在位置2,发挥15的能力值
第三个人放在位置1,发挥15的能力值
第四个人放在位置3,发挥114000的能力值
第五个人放在位置5,发挥469的能力值
团队总能力值:15+15+15+114000+469=11451415+15+15+114000+469=11451415+15+15+114000+469=114514
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct strk
{
ll num,sj;
};
strk a[6][100005];
bool cmp(strk a,strk b)
{
return a.sj>b.sj;
}
bool cmp1(ll a,ll b)
{
return a>b;
}
ll max(ll a,ll b)
{
return a>b?a:b;
}
ll c[50][6],q[6][100005],n,m,cnt,maxx=-1;
bool v[6],b[100005];
void dfs(int x,ll sum)
{
if(x==6)
{
maxx=max(sum,maxx);
return ;
}
for(int i=1;i<=5;i++)
{
if(b[a[x][i].num])continue;
b[a[x][i].num]=1;
dfs(x+1,sum+q[x][i]);
b[a[x][i].num]=0;
}
//dfs(x+1,sum);
}
int main()
{
cin>>n;
cnt=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=5;j++)
{
cin>>q[j][i];
a[j][i].sj=q[j][i];
a[j][i].num=i;
}
}
memset(b,false,sizeof(b));
for(int i=1;i<=5;i++)
{
sort(a[i]+1,a[i]+1+n,cmp);
sort(q[i]+1,q[i]+1+n,cmp1);
}
dfs(1,0);
cout<<maxx<<endl;
}