http://codeforces.com/problemset/problem/571/B

给出一个序列,可以任意调整序列的顺序,使得给出的式子的值最小

思路:我们可以把序列分解,变成k条链,n%k条n/k+1长度的,k-n%k条n/k长度的,然后发现,如果要求这个和最小,那么这些链我们都可以变成递增,而且链里面相邻元素是排序后的相邻元素才是最优的。这么样,我们考虑把数组排序,然后dp

考虑这样dp:f[i][j]代表n/k+1长度的有i条,n/k长度有j条,代表能删掉的最大的数,由于i和j确定以后,序列的长度我们也知道了,这样就能够转移了,最后答案就是a[n]-a[1]-f[num1][num2]

 #include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
int a[],f[][];
int n,K;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
int main(){
n=read();K=read();
for (int i=;i<=n;i++) a[i]=read();
std::sort(a+,a++n);
int num1=n%K,len1=n/K+;
int num2=K-n%K,len2=n/K;
a[]=a[];
for (int i=;i<=num1;i++)
for (int j=;j<=num2;j++){
if (i){
int k=(i-)*len1+j*len2;
f[i][j]=std::max(f[i][j],f[i-][j]+a[k+]-a[k]);
}
if (j){
int k=i*len1+(j-)*len2;
f[i][j]=std::max(f[i][j],f[i][j-]+a[k+]-a[k]);
}
}
printf("%d\n",a[n]-a[]-f[num1][num2]);
return ;
}

Codeforces 571B Minimization的更多相关文章

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

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

  2. 571B. Minimization(Codeforces Round #317)

    B. Minimization time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. CodeForces 572D Minimization(DP)

    题意翻译 给定数组AAA 和值kkk ,你可以重排AAA 中的元素,使得∑i=1n−k∣Ai−Ai+k∣\displaystyle\sum_{i=1}^{n-k} |A_i-A_{i+k}|i=1∑n ...

  4. Codeforces 868F Yet Another Minimization Problem 决策单调性 (看题解)

    Yet Another Minimization Problem dp方程我们很容易能得出, f[ i ] = min(g[ j ] + w( j + 1, i )). 然后感觉就根本不能优化. 然后 ...

  5. Codeforces 868F Yet Another Minimization Problem(分治+莫队优化DP)

    题目链接  Yet Another Minimization Problem 题意  给定一个序列,现在要把这个序列分成k个连续的连续子序列.求每个连续子序列价值和的最小值. 设$f[i][j]$为前 ...

  6. 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 ...

  7. Codeforces Round #317 (Div. 2) D Minimization (贪心+dp)

    D. Minimization time limit per test  2 seconds memory limit per test  256 megabytes input  standard ...

  8. codeforces 572 D. Minimization(dp+ 思维)

    题目链接:http://codeforces.com/contest/572/problem/D 题意:给出一个序列,可以任意调整序列的顺序,使得给出的式子的值最小 题解:显然要先排一下序,然后取相邻 ...

  9. CodeForces 868F Yet Another Minimization Problem(决策单调性优化 + 分治)

    题意 给定一个序列 \(\{a_1, a_2, \cdots, a_n\}\),要把它分成恰好 \(k\) 个连续子序列. 每个连续子序列的费用是其中相同元素的对数,求所有划分中的费用之和的最小值. ...

随机推荐

  1. c#秒转时分秒

          2个办法 @{             int hour = item.track / 3600;             int min = (item.track - hour * 3 ...

  2. lucene4.6 索引创建和搜索例子

    本文转自:http://blog.csdn.net/jyf211314/article/details/17503997           点击打开链接 lucene4.6小例子,Lucene全文检 ...

  3. python倒计时

    #coding=utf-8 #!/usr/bin/env python import datetime,time i=3 while i==3: spring=datetime.datetime(20 ...

  4. 文件夹65ad47d7-2e27-4a5c-b238-26643fdaeb98

    这几天发现电脑中毒了,本地开的服务预览页面时,页面会被插入Html代码.我用360扫描之后发现有木马病毒(c:\programData有个65ad47d7-2e27-4a5c-b238-26643fd ...

  5. POJ 2392 Space Elevator 背包题解

    多重背包.本题不须要二分优化.相对简单点.由于反复数十分小,小于10. 而添加一个限制每种材料的高度做法.假设使用逆向填表,那么仅仅须要从这个高度往小递归填表就能够了. 还有就是注意要排序,以限制高度 ...

  6. php中对MYSQL操作之批量运行,与获取批量结果

    <?php //批量运行,与获取结果 //创建一个mysqli对象 $mysqli = new MySQLi("主机名","mysqlusername". ...

  7. c语言学习之结构篇代码演示样例-输入n个同学的姓名,数学英语成绩,依照平均分从低到高排序并输出

    #include<stdio.h> void main(){ const int count = 5;//定义数量 struct student{ char name[80]; float ...

  8. [置顶] Android安全机制分析

    Android系统是基于Linux内核开发的,因此,Android系统不仅保留和继承了Linux操作系统的安全机制,而且其系统架构的各个层次都有独特的安全特性[2] . 1. Linux内核层安全机制 ...

  9. docke 网络配置

    一,docker 的bridge模式是和vmware中的nat模式类似的,但是如果想要弄成和vmwae中的bridge怎么办呢? 说明,bridge模式获取的Ip是与宿主机的ip是出于同一个网段的. ...

  10. js获取get值

    //获取get值 function getPar(par) { //获取当前URL var local_url = document.location.href; //获取要取得的get参数位置 va ...