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");
}

 

posted @ 2019-02-22 02:18  韵意  阅读(182)  评论(0编辑  收藏  举报