B - Polycarp‘s Practice

Polycarp is practicing his problem solving skill. He has a list of nn problems with difficulties a_1, a_2, \dots, a_na1​,a2​,...,an​, respectively. His plan is to practice for exactly kk days. Each day he has to solve at least one problem from his list. Polycarp solves the problems in the order they are given in his list, he cannot skip any problem from his list. He has to solve all nn problems in exactly kk days.

Thus, each day Polycarp solves a contiguous sequence of (consecutive) problems from the start of the list. He can't skip problems or solve them multiple times. As a result, in kk days he will solve all the nn problems.

The profit of the jj-th day of Polycarp's practice is the maximum among all the difficulties of problems Polycarp solves during the jj-th day (i.e. if he solves problems with indices from ll to rr during a day, then the profit of the day is \max\limits_{l \le i \le r}a_il≤i≤rmax​ai​). The total profit of his practice is the sum of the profits over all kk days of his practice.

You want to help Polycarp to get the maximum possible total profit over all valid ways to solve problems. Your task is to distribute all nn problems between kk days satisfying the conditions above in such a way, that the total profit is maximum.

For example, if n = 8, k = 3n=8,k=3 and a = [5, 4, 2, 6, 5, 1, 9, 2]a=[5,4,2,6,5,1,9,2], one of the possible distributions with maximum total profit is: [5, 4, 2], [6, 5], [1, 9, 2][5,4,2],[6,5],[1,9,2]. Here the total profit equals 5 + 6 + 9 = 205+6+9=20.

Input

The first line of the input contains two integers nn and kk (1 \le k \le n \le 20001≤k≤n≤2000) --- the number of problems and the number of days, respectively.

The second line of the input contains nn integers a_1, a_2, \dots, a_na1​,a2​,...,an​ (1 \le a_i \le 20001≤ai​≤2000) --- difficulties of problems in Polycarp's list, in the order they are placed in the list (i.e. in the order Polycarp will solve them).

Output

In the first line of the output print the maximum possible total profit.

In the second line print exactly kk positive integers t_1, t_2, \dots, t_kt1​,t2​,...,tk​ (t_1 + t_2 + \dots + t_kt1​+t2​+⋯+tk​ must equal nn), where t_jtj​ means the number of problems Polycarp will solve during the jj-th day in order to achieve the maximum possible total profit of his practice.

If there are many possible answers, you may print any of them.

Sample 1

Inputcopy Outputcopy
8 3 5 4 2 6 5 1 9 2 20 3 2 3

Sample 2

Inputcopy Outputcopy
5 1 1 1 1 1 1 1 5

Sample 3

Inputcopy Outputcopy
4 2 1 2000 2000 2 4000 2 2

Note

The first example is described in the problem statement.

In the second example there is only one possible distribution.

In the third example the best answer is to distribute problems in the following way: [1, 2000], [2000, 2][1,2000],[2000,2]. The total profit of this distribution is 2000 + 2000 = 40002000+2000=4000.

题目翻译

给定长度为n的序列,要求分成k段,最大化每段最大值的和

复制代码
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<string.h>
#include<climits>
#include<map>
#include<algorithm>
typedef long long ll;
using namespace std;
const int N = 2010;
int n, k;

struct node {
	int num, val;
}mm[N];

bool cmp1(node n1, node n2)
{
	return n1.val > n2.val;
}

bool cmp2(node n1, node n2)
{
	return n1.num < n2.num;
}

int main()
{
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
	{
		int num;cin >> num;
		mm[i].num = i;
		mm[i].val = num;
	}

	sort(mm + 1, mm + n + 1, cmp1);//先对整个序列按照数值的大小进行排序,去前k个数的和

	int sum = 0;
	for (int i = 1; i <= k; i++) sum += mm[i].val;

	sort(mm + 1, mm + k + 1, cmp2); //在对前k个数进行排序,做差分组

	cout << sum << endl;

	for (int i = 1; i < k; i++) cout << mm[i].num - mm[i - 1]. num << " ";
	cout << n - mm[k - 1].num << endl;

	return 0;
}
相关推荐
Lecea_L11 分钟前
你能在K步内赚最多的钱吗?用Java解锁最大路径收益算法(含AI场景分析)
java·人工智能·算法
Tony8812 分钟前
热题100 - 394. 字符串解码
java·算法
Lecea_L18 分钟前
🔍 找到数组里的“节奏感”:最长等差子序列
java·算法
是Dream呀20 分钟前
ResNeXt: 通过聚合残差变换增强深度神经网络
人工智能·算法
学习2年半1 小时前
53. 最大子数组和
算法
君义_noip2 小时前
信息学奥赛一本通 1524:旅游航道
c++·算法·图论·信息学奥赛
烁3472 小时前
每日一题(小白)动态规划篇5
算法·动态规划
网络探索者2 小时前
DirectX修复工具(DirectX Repair)官网免费下载
windows
独好紫罗兰2 小时前
洛谷题单2-P5717 【深基3.习8】三角形分类-python-流程图重构
开发语言·python·算法
滴答滴答嗒嗒滴2 小时前
Python小练习系列 Vol.8:组合总和(回溯 + 剪枝 + 去重)
python·算法·剪枝