题意翻译

给定数组AAA 和值kkk ,你可以重排AAA 中的元素,使得∑i=1n−k∣Ai−Ai+k∣\displaystyle\sum_{i=1}^{n-k} |A_i-A_{i+k}|i=1∑n−k​∣Ai​−Ai+k​∣ 最小。输出最小值。
题目描述

You've got array A A A , consisting of n n n integers and a positive integer k k k . Array A A A is indexed by integers from 1 1 1 to n n n .

You need to permute the array elements so that value

became minimal possible. In particular, it is allowed not to change order of elements at all.
输入输出格式
输入格式:

The first line contains two integers n,k n,k n,k ( 2<=n<=3⋅105 2<=n<=3·10^{5} 2<=n<=3⋅105 , 1<=k<=min(5000,n−1) 1<=k<=min(5000,n-1) 1<=k<=min(5000,n−1) ).

The second line contains n n n integers A[1],A[2],...,A[n] A[1],A[2],...,A[n] A[1],A[2],...,A[n] ( −109<=A[i]<=109 -10^{9}<=A[i]<=10^{9} −109<=A[i]<=109 ), separate by spaces — elements of the array A A A .

输出格式:

Print the minimum possible value of the sum described in the statement.

输入输出样例
输入样例#1: 复制

3 2
1 2 4

输出样例#1: 复制

1

输入样例#2: 复制

5 2
3 -5 3 -5 3

输出样例#2: 复制

0

输入样例#3: 复制

6 3
4 3 4 3 2 5

输出样例#3: 复制

3

说明

In the first test one of the optimal permutations is $ 1 4 2 $ .

In the second test the initial order is optimal.

In the third test one of the optimal permutations is $ 2 3 4 4 3 5 $ .

题解:首先显然如果把i,i+k,i+2×k等排列起来,这将是一条链,而且会有k条链。

链长可能有两种情况:n/k,n/k+1

显然同一条链中如果数字固定,单调的话链的贡献最小

显然如果单调的话,取连续的几个贡献最小

所以我们现将全部数字放到同一条链里,接着将这条长链断成k条长度为n/k,n/k+1的链,此时贡献需要减掉两条链之间的差值

于是问题转化成了求减掉差值的和的最大值

令i表示长边数量,j表示短边的数量

dp[i][j]=max(dp[i][j-1]+det1,dp[i-1][j]+det2)

因为只有两种边长,所以分割点所在的位置可以直接根据i和j推出

总贡献减去dp[cnt1][cnt2]即为答案

 

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define int long long
using namespace std; int n,k,a[];
int dp[][];
int ans; signed main()
{
scanf("%lld%lld",&n,&k);
int cnt1=n%k;
int cnt2=k-cnt1;
int len1=n/k+;
int len2=n/k;
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
}
sort(a+,a+n+);
for(int i=;i<=n;i++)
{
ans+=a[i]-a[i-];
}
for(int i=;i<=cnt1;i++)
{
dp[i][]=dp[i-][]+a[i*len1-len1+]-a[i*len1-len1];
}
for(int i=;i<=cnt2;i++)
{
dp[][i]=dp[][i-]+a[i*len2-len2+]-a[i*len2-len2];
}
for(int i=;i<=cnt1;i++)
{
for(int j=;j<=cnt2;j++)
{
dp[i][j]=max(dp[i][j-]+a[i*len1+j*len2-len2+]-a[i*len1+j*len2-len2],dp[i-][j]+a[i*len1+j*len2-len1+]-a[i*len1+j*len2-len1]);
}
}
printf("%lld",ans-dp[cnt1][cnt2]);
}

CodeForces 572D Minimization(DP)的更多相关文章

  1. Codeforces 571B Minimization:dp + 贪心【前后相消】

    题目链接:http://codeforces.com/problemset/problem/571/B 题意: 给你一个长度为n的数列a[i]. 现在你可以随意改变数字的位置,问你 ∑| a[i] - ...

  2. Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) Minimization dp

    原题链接:http://codeforces.com/contest/572/problem/D 题意 给你个数组A和n,k,问你排列A后,下面的最小值是多少. 题解 先排个序,要填充像1,1+k,1 ...

  3. codeforces 682D(DP)

    题目链接:http://codeforces.com/contest/682/problem/D 思路:dp[i][j][l][0]表示a串前i和b串前j利用a[i] == b[j]所得到的最长子序列 ...

  4. codeforces 666A (DP)

    题目链接:http://codeforces.com/problemset/problem/666/A 思路:dp[i][0]表示第a[i-1]~a[i]组成的字符串是否可行,dp[i][1]表示第a ...

  5. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  6. Codeforces 55D (数位DP+离散化+数论)

    题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...

  7. Codeforces 264B 数论+DP

    题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...

  8. Codeforces 571B Minimization

    http://codeforces.com/problemset/problem/571/B 给出一个序列,可以任意调整序列的顺序,使得给出的式子的值最小 思路:我们可以把序列分解,变成k条链,n%k ...

  9. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

随机推荐

  1. 转转转-精通js正则表达式

    原文地址:http://www.cnblogs.com/aaronjs/archive/2012/06/30/2570970.html 正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字 ...

  2. multiboot 的golden image 和update image的 mcs文件的生成及调试

    multiboot的功能对于不同的FPGA应该是相同的,但是具体的配置可能不一样.基本流程如下: 上图来源是xapp1246,  明显分为5个步骤,在FPGA启动时是有flash的0地址开始,但是因为 ...

  3. Quartz实现JAVA定时任务的动态配置

    什么是动态配置定时任务? 首先说下这次主题,动态配置.没接触过定时任务的同学可以先看下此篇:JAVA定时任务实现的几种方式 定时任务实现方式千人千种,不过基础的无外乎 1.JDK 的Timer类 2. ...

  4. java程序控制KETTLE JOB的执行

    有时候我们想在java程序中触发远程服务器上kettle job的执行,并且获得执行结果.kettle的carte提供了远程执行job和transfer的功能. 我使用的kettle是6.1版本,部署 ...

  5. PyDev for eclipse 插件下载地址

    PyDev for eclipse 插件下载地址http://sourceforge.net/projects/pydev/files/pydev/python解释器以及python类库下载地址htt ...

  6. CUDA 新版本 Visual Studio 和 CUDA 兼容性的小问题

    ▶ 升级到 Visual Studio 2017 和 CUDA 9.1 之后,直接编译以前的 CUDA C 程序出现了如下报错: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E00 ...

  7. C# 子窗体关闭父窗体的简单方法

    当在一个窗体中调用另一个窗体时,涉及到子窗体关闭的同时,父窗体同时关闭. 例如: 在窗体1中,单击按钮调用窗体2,通过this传递 private void button1_Click(object ...

  8. javascript客户端遍历控件与获取父容器对象

    javascript客户端遍历控件与获取父容器对象示例代码 1,遍历也面中所有的控件function findControlAll()    {        var inputs=document. ...

  9. LInux Centos7 重装yum

    Linux yum默认安装python2.7,犹豫2020年之后不更新, 安装python3.6,出现了yum运行失败, 因为yum是依赖python的 1:先删除原有YUM rpm -aq|grep ...

  10. JSON.parse() 方法解析一个JSON字符串

    JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换. 语法EDIT JSON.pa ...