牛客对应题目链接:组队竞赛_牛客笔试题_牛客网 (nowcoder.com)
一、分析题目
运用 贪心 思想:
- 先将数组排好序。
- 总和最大 -> 每个小组的分数尽可能大。
- 最大的数拿不到,只能退而求其次拿到倒数第⼆个⼈的分数,再补上一个小的数来消耗。(消耗一个最大和一个最小的数)
二、代码
1、未看题解之前AC的代码
#include <iostream> #include <algorithm> #include <vector> using namespace std; typedef long long LL; const int N=1e5+10; int a[3*N]; int main() { int n; cin >> n; for(int i=0; i<3*n; i++) cin >> a[i]; sort(a, a+3*n); vector<int> dp(n); int k=3*n-2; for(int i=0; i<n; i++) { dp[i]=a[k]; k-=2; } LL sum=0; for(int i=0; i<n; i++) sum+=dp[i]; cout << sum << endl; return 0; }
2、值得学习的代码
#include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int N = 1e5 + 10; int n; LL arr[N * 3]; int main() { cin >> n; for(int i = 0; i < 3 * n; i++) cin >> arr[i]; sort(arr, arr + 3 * n); int pos = 3 * n - 2, count = 1; LL ret = 0; while(count++ <= n) { ret += arr[pos]; pos -= 2; } cout << ret << endl; return 0; }
三、反思与改进
这道题刚开始没什么思路,后面按照题意去模拟思考就可以知道该如何拿到第二大的数了。其次,得注意这道题的输入数据是有 3*n 个的,所以在给数组开大小和排序,以及后面 k 的取值都需要从 3*n 开始考虑。再者,就是要注意这道题目所给的数据范围,因为是求和,所以可能会超出数据范围,那么这里就得用到 long long 来存储数据。