zoukankan      html  css  js  c++  java
  • Comet OJ 夏季欢乐赛 篮球校赛

    Comet OJ 夏季欢乐赛 篮球校赛

    题目传送门

    题目描述

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

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

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

    教练mym**y想让你帮忙选择出 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

    采用了二进制优化的DP。

    CODE:

    #include<cstdio>
    #include<algorithm>
    #define ll long long
    using namespace std;
    ll n;
    ll a[100001][5];
    ll dp[100001][32];
    ll maxx(ll a,ll b)
    {
    	return a>b?a:b;
    }
    int main()
    {
    	scanf("%lld",&n);
    	for(int i=1;i<=n;i++)
    		for(int j=0;j<5;j++)
    			scanf("%lld",&a[i][j]);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<32;j++)
    		{
    			dp[i][j]=dp[i-1][j];
    			for(int k=0;k<5;k++)
    				if(j&(1<<k))
    					dp[i][j]=maxx(dp[i][j],dp[i-1][j-(1<<k)]+a[i][k]);
    		}
    	printf("%lld",dp[n][31]);
    	return 0;
    }
    

    大佬的第二份代码@Littleseven
    深搜+结构体

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    typedef long long ll;
    const int maxn = 100005;
    
    ll n,maxans;
    bool book[maxn];
    struct pos{ int num, id; } a[6][maxn];
    bool cmp(pos a, pos b){ return a.num>b.num; }
    void dfs(int p,ll sum)
    {
    	if(p == 6) { maxans = max(maxans, sum); return; }
    	for(int i=1;i<=5;i++)
    	{
    		if(book[a[p][i].id]==0)
    		{
    			book[a[p][i].id]=1;
    			dfs(p+1, sum+a[p][i].num);
    			book[a[p][i].id]=0;
    		}
    	}
    }
    int main()
    {
    	cin >> n;
    	for(int i=1; i<=n; i++)
    		for(int j=1; j<=5; j++) cin >> a[j][i].num, a[j][i].id = i;
    	for(int i=1; i<=5; i++) sort(a[i]+1, a[i]+n+1, cmp);
    	dfs(1,0);
    	cout<<maxans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    首次使用随便写点哦
    js中call、apply和bind的区别
    前端的事件流以及事件处理程序
    javascript中数组的深拷贝的方法
    我的第一篇博客
    圆盘转动按钮-react native
    鼠标拖拽删除
    js基础 -----鼠标事件(按下 拖拽)
    清除浮动的几种常用方法
    VUE常见问题解决
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11264938.html
Copyright © 2011-2022 走看看