#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define min(a,b) ( (a)< (b)? (a): (b) )
int n, m;
int const N= 400100;
typedef long long LL;
/*
dp[i]= min{ dp[j]+ sum[i]- sum[j]+ ( i- j )* data[j+ 1] }
要求分段的序列长度不小于 m,即 i- j+ 1>= m
假设 j> k, 要使决策 j 比决策 k 优, 则有
dp[j]+ sum[i]- sum[j]+ ( i- j )* data[j+ 1]<
dp[k]+ sum[i]- sum[k]+ ( i- k )* data[k+ 1]
整理有:
dp[j]- sum[j]- j* data[j+ 1]- ( dp[k]- sum[k]- k* data[k+ 1] )
< i* ( data[j+ 1]- data[k+ 1] )
所以 j 比 k 优等价于
( dp[j]- dp[k]- sum[j]+ sum[k]- j* data[j+ 1]+ k* data[k+ 1] )/
( data[j+ 1]- data[k+ 1] )< i
今 F[j,k]= 上式左边
对于 k< j< i< t
假设 F[j, k]> F[i, j]
如果 F[i, j]< t 则 i 比 j 优
如果 F[i, j]> t 则 F[j, k]> t 得到 k 比 j 优
故对于满足条件 F[j,k]> F[i,j] 的可以剔除 j 状态
因为长度要不小于 2* m 故 1到 m- 1 都不可能成为决策点
对于 i, 能成为 i 状态的决策点的最小 j 为 i- m+ 1,并且对于
t> i, 这个最小 j= i- m+ 1 也有可能成为 t 的决策点
故对于当前状态 i ( i- m+ 1>= m ) 将决策点 i- m+ 1 加入
*/
LL dp[N], data[N], sum[N];
int que[N], head, tail;
inline LL S( int j, int k ){
return data[j+ 1]- data[k+ 1];
}
inline LL G( int j, int k ){
return dp[j]- sum[j]+ j* data[j+ 1]-
( dp[k]- sum[k]+ k* data[k+ 1] );
}
int main(){
while( scanf("%d%d",&n,&m)!= EOF ){
sum[0]= 0;
for( int i= 1; i<= n; ++i )scanf("%I64d", data+ i );
sort( data+ 1, data+ 1+ n );
for( int i= 1; i<= n; ++i )sum[i]= sum[i-1]+ data[i];
head= 0, tail= 0;
que[++tail]= 0; dp[0]= 0;
for( int i= m; i<= n; ++i ){
while( head< tail && S(que[head+ 1],que[head])* i>= G( que[head+ 1], que[head] ) )
head++;
dp[i]= dp[ que[head] ]+ ( sum[i]-sum[que[head]] )- ( i- que[head] )* data[ que[head]+ 1 ];
if( i- m+ 1>= m ) que[++tail]= i- m+ 1;
int j= que[tail]; tail--;
while( head< tail && G( que[tail], que[tail-1] )* S( j, que[tail] )>=
G( j, que[tail] )* S( que[tail], que[tail-1] ) ) tail--;
que[++tail]= j;
}
printf("%I64d\n", dp[n] );
}
return 0;
}
分享到:
相关推荐
HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...
### hdu1250高精度加法 ...虽然题目提到的代码实现相对繁琐且效率不高,但通过理解其背后的逻辑,我们可以进一步优化代码结构,提高程序的执行效率。对于类似的大数运算问题,掌握高精度算法是非常重要的基础技能。
ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...
动态规划通常用于优化多阶段决策过程,通过将问题分解为更小的子问题并存储子问题的解来避免重复计算,从而提高效率。 【描述】提到的"HDU的一题"可能是指HDU(杭州电子科技大学)在线判题系统中的一道动态规划题目...
【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
6. **复杂度分析**:了解时间复杂度和空间复杂度的概念,能够分析和优化代码的运行效率,这是ACM竞赛中的关键能力。 7. **IO处理**:学会标准输入输出(scanf/printf)和文件输入输出,以及快速读入大整数(如使用...
【ACM入门与提高:HDU ACM竞赛课程详解】 ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest,简称ICPC或ACM/ICPC)是一项全球性的竞赛,旨在激发大学生对计算机科学的兴趣,提升他们的...
4. **代码调试与优化**:由于有些代码可能不完整,这为学习者提供了实践调试和优化代码的机会,理解为何某些代码无法正确运行,以及如何改进它们。 5. **版本控制与文件管理**:在处理多个题目和不同版本的代码时,...
HDU是杭州电子科技大学(Hangzhou Dianzi University)举办的一个在线编程竞赛平台,全称为HDU Online Judge。ACM是国际大学生程序设计竞赛(International Collegiate Programming Contest)的缩写,是一个全球性的...
5. **优化技巧**:如何减少时间复杂度,使用位运算优化、循环展开、记忆化搜索等方法提升代码效率。 6. **调试和测试**:理解如何编写测试用例来检查代码的正确性,以及如何利用调试工具定位和修复错误。 7. **...
【标题】"hdu_acm_1084.rar_ACM_HDU10_acm10_hdu_hdu 1084" 提供的是一个关于杭电(HDU)ACM竞赛第1084题的解决方案。该题目可能是在编程竞赛中常见的算法问题,而ACM(国际大学生程序设计竞赛)是全球知名的编程...
hdu2101AC代码
【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。
HDU ACM教案是针对ACM/ICPC(国际大学生程序设计竞赛)的训练教程,旨在帮助参赛者提升算法和编程技能。"搜索入门"这部分内容是教程中的一个重要章节,主要介绍在解决算法问题时如何有效地运用搜索策略。在这个章节...