#include <bits/stdc++.h> using i64 = long long; void solve() { int n, k; std::cin >> n >> k; std::vector<int> a(n); for (int i = 0; i < n; i++) { std::cin >> a[i]; } std::sort(a.begin(), a.end()); i64 ans = -1E18; std::vector<i64> s(n + 1); for (int i = 0; i < n; i++) { s[i + 1] = s[i] + a[i]; } for (int i = 0; i <= k; i++) { ans = std::max(ans, s[n - (k - i)] - s[2 * i]); } std::cout << ans << "\n"; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t; std::cin >> t; while (t--) { solve(); } return 0; }
时间: 2024-03-28 19:40:29 浏览: 113
c++万能头文件(包含所有其他头文件)#include<bits/stdc++.h> 注:此cpp文件包含万能头文件以及基本框架
5星 · 资源好评率100%
这段代码实现了一个题目的解法,题目描述和输入输出格式没有提供,但是可以猜测是一个数组分段求和的问题。具体解法如下:
1. 读入数据,包括数组长度 n 和分段数 k,以及数组 a。
2. 对数组 a 进行排序。
3. 计算前缀和数组 s,其中 s[i] 表示 a[0] 到 a[i-1] 的和。
4. 枚举区间 [i, n-(k-j)],其中 i 表示前 j 段的末尾位置(即前 j 段的元素个数为 2*j),n-(k-j) 表示后面 k-j 段的开头位置(即后面 k-j 段的元素个数为 n-(k-j)-i),计算该区间的和。
5. 在所有区间和中找到最大值,输出该值。
代码的时间复杂度为 O(t*n*logn),其中 t 是测试数据组数,n 是数组长度,logn 是排序的时间复杂度。
阅读全文