题目描述
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; }
原文地址:https://www.cnblogs.com/ydw--/p/11264381.html
时间: 2024-11-10 15:54:57