全国绿色计算大赛 预赛第二阶段(C++)第二关

第二关:

挑战任务

绿盟和各大名企合作,举办编程能力大赛,需要选拔一支参赛队伍。队伍成员全部来自“绿盟杯”中表现优秀的同学,每个同学都根据在比赛中的表现被赋予了一个能力值。现在被召集的N个同学已经集结完毕,他们按照编号依次站成了一排。

你需要编写一个程序,从这N个同学中选出S个同学,要求选出的同学的能力值的乘积最大,且要求被选出的相邻两个同学的编号的差不超过D

编程要求

补全右侧代码区中的getBestTeams(int n,int a[],int kk, int d)函数,实现找出能力值乘积最大而且满足编号要求的同学。将最终结果作为返回值返回,函数参数说明如下:

int n 召集到的同学的人数
int a[] 各个同学的能力值(依次对应不同编号的同学,数组的index就是学生的编号)
int kk 需要选出的同学的人数
int d 相邻同学的编号的差的最大值

测试说明

样例1:
输入:
3 , [7,4,7] , 2 , 50

输出:
49

int getBestTeams(int n,int a[],int kk, int d){
			/*********begin*********/
			long long f[55][15][2];
			long long ans=0;
			for(int i=1;i<=n;i++){
				f[i][1][0]=f[i][1][1]=a[i];
				for(int j=2;j<=kk;++j){
					for(int k=i-1;k>=max(i-d,1);--k){
						f[i][j][0]=max(f[i][j][0],max(f[k][j-1][0]*a[i],f[k][j-1][1]*a[i]));
						f[i][j][1]=min(f[i][j][1],min(f[k][j-1][0]*a[i],f[k][j-1][1]*a[i]));
					}
				}
				ans=max(ans,max(f[i][kk][0],f[i][kk][1]));
			}
			return ans;
	
			/*********end*********/
		}		

 

你可能感兴趣的:(全国绿色计算大赛 预赛第二阶段(C++)第二关)