Comet OJ 篮球校赛 深搜

题目描述

 

JWJU注重培养学生的“唱,跳,rap,篮球”能力。于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台。校赛冠军的奖励是看wls女装一次,为了这个目标,大家都努力训练,希望自己能看到wls女装。

教练my手下有 n 名队员,现在他要挑选 5 人组成一个篮球队来参赛。众所周知,一个篮球队伍有五个不同的位置(控球后卫,得分后卫,小前锋,大前锋,中锋),现在教练mymy给出每名队员在每个位置的能力。

注:如果一个队员作为控球后卫出战,则他只能发挥他的控球后卫的能力值。(其他位置类似)

教练mymy想让你帮忙选择出 5名队员,分别放置在队伍中的不同位置。求他们组成的队伍的最大能力值之和。

 
 

输入描述

 

输出第一行包含一个正整数 n (5-n-10^5

接下来包含 nn 行,每行包含 5 个正整数,描述每个队员在每个位置的能力值。每项能力值的取值范围都在 [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=114514

思路:五个位置每个位置选前5个最强者 共25人(有重复)

然后深搜出最大值  (要用到visit数组)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
bool vis[100005];
ll co[100005][6];
ll mmax[6][6], ans = 0;
void dfs(int now, ll tmp){//now 第几列 一列一列看  
    if(now == 6){
        ans = max(ans, tmp);
        return;//一定要return  即不进行下面的for循环 
    }
    for(int i = 1; i <= 5; i++){
        if(vis[mmax[i][now]])    continue;//看该行是否visit过 
        vis[mmax[i][now]] = 1;
        dfs(now + 1, tmp + co[mmax[i][now]][now]);
        vis[mmax[i][now]] = 0;
    }
}
/*mmax[i][j] 第j列 第i大的数  所属阵营(即第几行) 
mmax数组
     4 4 4 5 5
     3 2 5 1 4
     5 1 3 3 3 
     1 3 1 2 1
     2 5 2 4 2
 */ 
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[i][j] > co[mmax[pos][j]][j])
                {
                    for(int k = 5; k >= pos + 1; k--)//大就往后推 并退出循环 
                        mmax[k][j] = mmax[k-1][j];
                    mmax[pos][j] = i;
                    break;
                }
            }
        }
    }
    dfs(1, 0);
    cout << ans << endl;
}
View Code

猜你喜欢

转载自www.cnblogs.com/ydw--/p/11264381.html