Codeforces - 1114B - Yet Another Array Partitioning Task - 构造 - 排序
https://codeforces.com/contest/1114/problem/B
一开始叫我做,我是不会做的,我没发现这个性质。
其实应该很好想才对,至少要选m个元素,其中m个作为最大值,从总体上考虑的话,要是能区分哪些元素处于前m*k大,就把他们m个一组直接划分就好了。
魔理沙dalao说还不需要用sort来降序,用nth_element,我还在想怎么从序列中复原出标号,其实只需要在一起nth_element就好了。
#include<bits/stdc++.h> using namespace std; #define ll long long int n,m,k; pair<int,int> a[200005]; int idx[200005]; int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++){ scanf("%d",&a[i].first); a[i].second=i; } nth_element(a,a+m*k,a+n,greater<pair<int,int> >()); ll sum=0; for(int i=0;i<m*k;i++){ sum+=a[i].first; idx[i]=a[i].second; } printf("%lld\n",sum); sort(idx,idx+m*k); for(int i=0;i<m*k;i++){ if(i%m==0&&i){ if(i!=m) printf(" "); printf("%d",idx[i]); } } printf("\n"); }