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;
}
相关推荐
奔跑吧邓邓子8 分钟前
【C语言实战(75)】C语言内存探秘:泄漏检测与分析实战
linux·c语言·windows·内存·开发实战·泄露检测
Nebula_g12 分钟前
C语言应用实例:斐波那契数列与其其他应用
c语言·开发语言·后端·学习·算法
不穿格子的程序员18 分钟前
从零开始刷算法-单调栈-每日温度
算法·单调栈
麦烤楽鸡翅19 分钟前
挡住洪水 (牛客)
java·数据结构·c++·python·算法·bfs·牛客
MicroTech202519 分钟前
微算法科技(NASDAQ MLGO)采用动态层次管理和位置聚类技术,修改pBFT算法以提高私有区块链网络运行效率
科技·算法·聚类
~~李木子~~20 分钟前
五子棋项目Alpha-Beta剪枝与MCTS+神经网络实现人机对弈算法对比报告
神经网络·算法·剪枝
bigdata-rookie20 分钟前
JVM 垃圾收集器介绍
java·jvm·算法
ʚ希希ɞ ྀ22 分钟前
leeCode hot 100 !!!持续更新中
数据结构·算法·leetcode
lemontree194522 分钟前
CRC8算法通用版本
算法
热爱生活的猴子23 分钟前
算法322. 零钱兑换
算法