zoukankan      html  css  js  c++  java
  • B. Yet Another Array Partitioning Task ——cf

    B. Yet Another Array Partitioning Task
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    An array bb is called to be a subarray of aa if it forms a continuous subsequence of aa , that is, if it is equal to alal , al+1al+1 , … , arar for some l,rl,r .

    Suppose mm is some known constant. For any array, having mm or more elements, let's define it's beauty as the sum of mm largest elements of that array. For example:

    • For array x=[4,3,1,5,2]x=[4,3,1,5,2] and m=3m=3 , the 33 largest elements of xx are 55 , 44 and 33 , so the beauty of xx is 5+4+3=125+4+3=12 .
    • For array x=[10,10,10]x=[10,10,10] and m=2m=2 , the beauty of xx is 10+10=2010+10=20 .

    You are given an array a1,a2,,ana1,a2,…,an , the value of the said constant mm and an integer kk . Your need to split the array aa into exactly kk subarrays such that:

    • Each element from aa belongs to exactly one subarray.
    • Each subarray has at least mm elements.
    • The sum of all beauties of kk subarrays is maximum possible.
    Input

    The first line contains three integers nn , mm and kk (2n21052≤n≤2⋅105 , 1m1≤m , 2k2≤k , mknm⋅k≤n ) — the number of elements in aa , the constant mm in the definition of beauty and the number of subarrays to split to.

    The second line contains nn integers a1,a2,,ana1,a2,…,an (109ai109−109≤ai≤109 ).

    Output

    In the first line, print the maximum possible sum of the beauties of the subarrays in the optimal partition.

    In the second line, print k1k−1 integers p1,p2,,pk1p1,p2,…,pk−1 (1p1<p2<<pk1<n1≤p1<p2<…<pk−1<n ) representing the partition of the array, in which:

    • All elements with indices from 11 to p1p1 belong to the first subarray.
    • All elements with indices from p1+1p1+1 to p2p2 belong to the second subarray.
    • … .
    • All elements with indices from pk1+1pk−1+1 to nn belong to the last, kk -th subarray.

    If there are several optimal partitions, print any of them.

    Examples
    Input
    Copy
    9 2 3
    5 2 5 2 4 1 1 3 2
    
    Output
    Copy
    21
    3 5 
    Input
    Copy
    6 1 4
    4 1 3 2 2 3
    
    Output
    Copy
    12
    1 3 5 
    Input
    Copy
    2 1 2
    -1000000000 1000000000
    
    Output
    Copy
    0
    1 
    Note

    In the first example, one of the optimal partitions is [5,2,5][5,2,5] , [2,4][2,4] , [1,1,3,2][1,1,3,2] .

    • The beauty of the subarray [5,2,5][5,2,5] is 5+5=105+5=10 .
    • The beauty of the subarray [2,4][2,4] is 2+4=62+4=6 .
    • The beauty of the subarray [1,1,3,2][1,1,3,2] is 3+2=53+2=5 .

    The sum of their beauties is 10+6+5=2110+6+5=21 .

    In the second example, one optimal partition is [4][4] , [1,3][1,3] , [2,2][2,2] , [3][3] .

    大意:
    这个题目是给你n个数据,让你分成k段,每一段至少m个数,并且把每一段的前m大的数求和
    输出求和的结果,和分段的位置、
    思路:
    是求这每一段的前m大的数,其实可以转化成,求这一组数前m*k大的数之和。
    至于求分段的位置,这个就有点麻烦了,可以把每一个位置初始标记为0,
    然后在求sum的同时,将求过的数位置标记成1,之后求分段位置的时候,
    就可以进行累加,一旦累加之和为m,说明这m个数组成了一段,也就是在这个位置将数组分段。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+10;
    struct node
    {
        int x,id;
    }a[maxn];
    bool vis[maxn];
    bool cmp(node a,node b)
    {
        return a.x>b.x;
    }
    int main()
    {
        int n,m,k;
        memset(vis,0,sizeof(vis));
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i].x);
            a[i].id=i;
        }
        sort(a+1,a+1+n,cmp);
        ll sum=0;
        for(int i=1;i<=m*k;i++)
        {
            sum+=a[i].x;
            vis[a[i].id]=1;
            //printf("a.id=%d
    ",a[i])
        }
        printf("%I64d
    ",sum);
        int s=0;;
        for(int i=1;i<=n;i++)
        {
            s=s+vis[i];
          //  printf("%d %d
    ",i,s);
            if(s==m&&k!=1)
            {
            	k--;
            	s=0;
                printf("%d ",i);
            }
        }
        printf("
    ");
        return 0;
    }
    

      

  • 相关阅读:
    Java8系列之重新认识HashMap(转)
    kafka 消费者和生产者测试类
    zookeeper配置
    JNLP应用程序无法打开的解决办法
    Functional Programming 资料收集
    Python的问题解决: IOError: [Errno 32] Broken pipe
    python的subprocess的简单使用和注意事项
    Python tricks(7) -- new-style class的__slots__属性
    Python tricks(6) -- python代码执行的效率
    Python tricks(5) -- string和integer的comparison操作
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/10361960.html
Copyright © 2011-2022 走看看