有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
输入描述:每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值 ai(-50 <= ai <= 50)。接下来的一行包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。
输出描述:输出一行表示最大的乘积。
输入例子:37 4 72 50
输出例子:49
C++源代码:
// NetEase problem 2017.03.11 // 2017.04.21 by wyj /* 名企笔试:网易2017内推笔试编程题(合唱团)2017-03-11 算法爱好者 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生, 要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗? 输入描述: 每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50), 表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值 ai(-50 <= ai <= 50)。 接下来的一行包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。 输出描述: 输出一行表示最大的乘积。 输入例子: 3 7 4 7 2 50 输出例子: 49 */ #include #include using namespace std; int Min_product(int num, int last); int Max_product(int num, int last); int a[50] = { 0 }; int n, k, d; int main() { int maxpd = INT_MIN, minpd = INT_MAX, temp; int i, j; cin >> n; //输入学生个数n for (j = 0;j < n;j++) //输入学生能力值 cin >> a[j]; cin >> k >> d; //输入k和d for (i = n - 1;i >= k - 1;i--) //计算最大乘积 { temp = Max_product(k, i); if (temp > maxpd) maxpd = temp; } /* for (i = n - 1;i >= k - 1;i--) //计算最小乘积 { temp = Min_product(k, i); if (temp < minpd) minpd = temp; } cout << minpd << endl; //输出最小乘积 */ cout << maxpd << endl; //输出最大乘积 } int Max_product(int num, int last) //num个数字乘积的最大值(所选最后一个学生下标为last) { int max = INT_MIN; int temp; int i; if (num == 1) max = a[last]; else if (last == num - 1) for (max = 1, i = 0;i <= last;i++) max *= a[i]; else for (i = last - 1;(i >= last - d) && (i >= num - 2);i--) { if (a[last] < 0) temp = a[last] * Min_product(num - 1, i); //如果a[last]<0,求num-1个元素最小积 else temp = a[last] * Max_product(num - 1, i); //如果a[last]>=0,递归调用Max_product() if (temp > max) max = temp; //最大积 } return max; } int Min_product(int num, int last) //num个数字乘积的最小值(所选最后一个学生下标为last) { int min = INT_MAX; int temp; int i; if (num == 1) min = a[last]; else if (last == num - 1) for (min = 1, i = 0;i <= last;i++) min *= a[i]; else for (i = last - 1;(i >= last - d) && (i >= num - 2);i--) { if (a[last] < 0) temp = a[last] * Max_product(num - 1, i); //如果a[last]<0,求num-1个元素最大积 else temp = a[last] * Min_product(num - 1, i); //如果a[last]>=0,递归调用Min_product() if (temp < min) min = temp; //最小积 } return min; }
名企笔试:网易2017内推笔试编程题(合唱团)2017-03-11 算法爱好者
最新推荐文章于 2019-05-22 21:30:00 发布