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