CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)G ——篮球校赛(dfs/状压DP)

本文介绍了一种算法,用于从多名队员中选择最佳的5人篮球队伍,以最大化队伍的综合能力值。通过筛选每个位置能力排名前五的队员,并使用深度优先搜索(DFS)确定最优组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

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

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

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

输入描述

输出第一行包含一个正整数 nn (5 \le n \le 10^{5}5≤n≤105)。

接下来包含 nn 行,每行包含 55 个正整数,描述每个队员在每个位置的能力值。每项能力值的取值范围都在 [1,10^{9}][1,109]。

输出描述

输出一行一个正整数代表组成的队伍的最大能力值之和。

样例输入 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

思路:

就是把每个位置的排名前五的找出来,再dfs找最大的可能就行

#include<iostream>
using namespace std;
const int maxn = 1e5+5;
long long Max[6][6],pre[maxn][6],ans=0;
int vis[maxn];
int n;
void dfs(int num,long long sum){
	if(num==6){
		ans=max(ans,sum);
		return ;
	}
	for(int i=1;i<=5;i++){
		if(vis[Max[i][num]])
		    continue;
		vis[Max[i][num]]=1;
		dfs(num+1,sum+pre[Max[i][num]][num]);
		vis[Max[i][num]]=0;
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=5;j++){
			scanf("%lld",&pre[i][j]);
			
			for(int pos=1;pos<=5;pos++){//前五 
				if(pre[i][j]>pre[Max[pos][j]][j]){
					for(int k=5;k>pos;k--){
						Max[k][j]=Max[k-1][j];//移位 
					}
					Max[pos][j]=i;
					break;
				}
			}
			
		}
	}
	dfs(1,0);
	printf("%lld\n",ans);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值