zoukankan      html  css  js  c++  java
  • Codeforces

    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
    ",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("
    ");
    }
  • 相关阅读:
    python-杂烩
    24 Python 对象进阶
    23 Python 面向对象
    22 Python 模块与包
    21 Python 异常处理
    20 Python 常用模块
    18 Python 模块引入
    2 Python 基本语法
    1 Python 环境搭建
    3 Python os 文件和目录
  • 原文地址:https://www.cnblogs.com/Yinku/p/10416190.html
Copyright © 2011-2022 走看看