原题链接:蓝桥杯算法提高VIP-最大乘积
解题思路: 按从小到大排序
分为两种情况:
第一种:m为偶数, 取2k个正数和n-2k个负数,依次比较, 取最大值即可
第二种:m为正数,去2k+1个整数和n - (2k+1)个负数,依次比较,取最大值即可
参考代码:
#include<bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 7; int a[MAXN]; int main() { int t, n, m; cin >> t; while(t--) { scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); sort(a + 1, a + n + 1); long long maxx = -1e9; if(m % 2 == 0) { for(int i = 0; i <= m; i += 2) { long long ans = 1; for(int j = 1; j <= i; ++j) ans *= a[j]; for(int j = n; j > n - m + i; --j) ans *= a[j]; maxx = max(maxx, ans); } } else { for(int i = 1; i <= m; i += 2) { long long ans = 1; for(int j = n; j > n - i; --j) ans *= a[j]; for(int j = 1; j <= m - i; ++j) ans *= a[j]; maxx = max(maxx, ans); } } cout << maxx << endl; } return 0; }
0.0分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复