题意:给你一个升序数列,两个整数n,k,满足将序列分为k个(递增)数组,每个数组n个数,并使每个数组的中位数之和最大。
要递增,又要和最大,所以先确定中位数的位置(因为每个数组程度已知),将输入序列从最后一位(即最大值)从后开始排,直到排到中位数(包括),再用前面的数排。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long t,sum;
cin>>t;
long long a[200005]={0};
while(t--)
{
sum=0;
long long n,k,p;
cin>>n>>k;
for(long long i=1;i<=n*k;i++)
{
cin>>a[i];
}
p=n/2+1;//中位数位置
for(long long i=n*k-p+1;k>0;i-=p,k--)//从最大的数开始排
{
sum+=a[i];
}
cout<<sum<<endl;
}
return 0;
} 
京公网安备 11010502036488号