传送门:https://codeforces.com/contest/1114/problem/B
//美丽和:对于常数m,一个数组中最大的m个数的和叫做美丽和 ,比如数组5 4 9 8 1,m=2,美丽和就是9+8=17
//这道题的意思是给定一个数组,把这个数组分成k段,每段的美丽和的总合要最大
/总合要最大,就是要使得总合为这个数组中最大的mk个数相加,所以在分段的时候需要把每m个最大的数
放在一段里,其他的数可以随意放置 */
/输出实际就是输出最大的mk个数的总合(注意这里会爆int),和分成的每段的最后一个数字的位置,最后一段
不用 */
#include<iostream>
#include<algorithm>
using namespace std;
const int N=200010;
typedef long long ll;
ll a[N];
ll b[N];
ll c[N];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
ll n,m,k,i,j;
cin>>n>>m>>k;
for(i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];//将a数组复制到b数组
}
sort(b+1,b+1+n,cmp);//对数组进行排序,以实现找到最大的前m*k个数
ll sum=0;
for(i=1;i<=m*k;i++)
{
sum+=b[i];
}
cout<<sum<<endl;
int vis=0;
for(i=1;i<=m*k;i++)//这个循环的作用是找出第m*k个数被用了多少次
/*比如这个样例:10 2 3
4 2 2 2 2 3 5 2 5 7*/
//如果不标记被用了多少次,就会分成42 22 2235257 这样,很明显这样是不对的
{
if(b[i]==b[m*k])
vis++;
}
ll num=b[m*k];
int count=0;//用count计算是否有m个美丽和需要的数
int flag=1;//防止pe
for(i=1;i<n;i++)
{
if(a[i]>num)
count++;
if(a[i]==num)
{
if(vis>0)
{
count++;
vis--;
}
}
if(count==m)
{
cout<<i;
j=i;
break;
}
}
count=0;
for(i=j+1;i<=n;i++)
{
if(flag>=k-1)
break;
if(a[i]>num)
count++;
if(a[i]==num)
{
if(vis>0)
{
count++;
vis--;
}
}
if(count==m)
{
flag++;
cout<<" "<<i;
count=0;
}
}
cout<<endl;
return 0;
}
谢谢!