【贪心】 Polycarp's Practice

17暑假练习赛2 Codeforces Round #498 (Div. 3) 1006B


【题意】:给定一个数字n和m和大小为n的数组,将数组分为m个区间,要求区间最大值之和最大值以及分区大小(不唯一)。

【分类】:贪心题
【分析】:用结构体记录数值和位置,由大到小排序得到前k个数值之和就是最大值。难点是求分区大小,可以建立一个新数组id记录前k大数的位置,注意位置需要从小到大排序。比如第一个样例就是0 3 6,那么分区为3 3 2——>3-0/6-3/8-6


#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n,m;
struct node
{
    int num,pos;
}a[N];
vector<int> v;
int id[N];
bool cmp(node a,node b)
{
    return a.num > b.num;
}
int main()
{
    scanf("%d%d",&n,&m);
    int ans = 0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i].num);
        a[i].pos = i;
    }
    sort(a,a+n,cmp);
    for(int i=0; i<m; i++)
    {
        id[i] = a[i].pos;
        ans += a[i].num;
    }
    cout<<ans<<endl;
    id[m]=n;
    sort(id,id+m+1);
    printf("%d ",id[1]);
    for(int i=1; i<m-1; i++)
    {
       printf("%d ",id[i+1]-id[i]);
    }
    if(m!=1) printf("%d\n",id[m]-id[m-1]);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值