题解
题目大意 给你若干个数字 划分成k组 每组里面取m个最大值 要求每组的最大值总和最大
只需要在整个数组里面取k*m个最大值并记录所在位置 按照顺序遍历数字如果当前数字是被选中的最大值则cnt++
当cnt到达m时则说明当前位置是当前分段的最后位置 输出即可
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
#define fs first
#define sc second
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 2e5 + 10;
int a[MAXN], b[MAXN]; //记录哪个位置被使用
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int n, m, k;
cin >> n >> m >> k;
vector<pair<int, int>> v;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]), v.push_back({ a[i], i });
sort(v.begin(), v.end(), greater<pair<int, int>>());
ll s = 0;
for (int i = 0; i < m * k; i++) //只取前m*k大
s += v[i].fs, b[v[i].sc] = 1;
cout << s << endl;
int cnt = 0;
for (int i = 1; i <= n; i++)
if (b[i])
{
cnt++;
if (cnt == m && k > 1)
{
printf("%d ", i);
cnt = 0, k--;
}
}
cout << endl;
return 0;
}