题目链接:
思路:
先从大到小排序,然后将前m*k个数相加就是答案。
对于求区间,我是用的map存的,相对比较慢一些,但是也比较好想。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=2*1e5+5;
map<int,int>ma;
typedef long long ll;
int n,m,k;
int a[maxn];
int b[maxn];
int no[maxn];
ll ans=0;
int compare (int a,int b)
{
return a>b;
}
int main ()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n,compare);
for (int i=0;i<m*k;i++)
{
ans+=b[i];
ma[b[i]]++;
}
printf("%lld\n",ans);
int cnt=0;
for (int i=0,j=0;i<k-1;i++)
{
int t=0;
while (t<m)
{
if(ma[a[j]])
{
ma[a[j]]--;
t++;
}
j++;
}
no[cnt++]=j;
}
for (int i=0;i<cnt;i++)
printf("%d ",no[i]);
return 0;
}