【51Nod】1510 最小化序列 贪心+动态规划
【题目】1510 最小化序列
【题意】给定长度为n的数组A和数字k,要求重排列数组从而最小化:
$$ans=\sum_{i=1}^{n-k}|A_i-A_{i+k}|$$
输出最小的ans,\(n \leq 3*10^5,k \leq 5000,-10^9 \leq A_i \leq 10^9\)。
【算法】贪心+动态规划
先对序列从小到大排序,通过贪心容易发现连续的段在一起时最优。所以实际上要求将序列分成\(k\)段,其中\(n%k\)个大段和其它小段,小段的段长是\(g=\frac{n}{k}\),大段段长+1。
令\(f_{i,j}\)表示前面i个段有j个大段的最小代价,那么:
$$f_{i,j}=min { f_{i-1,j-1}+a_{ig+j}-a_{(i-1)g+j},f_{i-1,j}+a_{ig+j}-a_{(i-1)g+j+1} } $$
复杂度\(O(k^2+n \ \ log \ \ n)\)。
注意:开long long会爆空间除非用滚动数组。不用ll的话必须用unsigned int否则中间过程会爆int。初始化f[0][0]=1,f[0][1~k]=inf非常重要。
#include<cstdio>
#include<cstring>
#include<algorithm>
bool isdigit(char c){return c>='0'&&c<='9';}
int read(){
int s=0,t=1;char c;
while(!isdigit(c=getchar()))if(c=='-')t=-1;
do{s=s*10+c-'0';}while(isdigit(c=getchar()));
return s*t;
}
using namespace std;
#define ll long long
const int maxn=300010,kind=5010;
int n,k,a[maxn],ans;
unsigned int f[2][kind];
int main(){
n=read();k=read();
for(int i=1;i<=n;i++)a[i]=read();
sort(a+1,a+n+1);
int g=n/k,num=n%k;
int x=0;
f[x][0]=0;for(int i=1;i<=k;i++)f[x][i]=2000000001;
for(int i=1;i<=k;i++){
x=1-x;
f[x][0]=f[1-x][0]+a[i*g]-a[(i-1)*g+1];//long long
for(int j=1;j<=k;j++)f[x][j]=min(f[1-x][j-1]+a[i*g+j]-a[(i-1)*g+j],f[1-x][j]+a[i*g+j]-a[(i-1)*g+j+1]);
}
printf("%d",f[x][num]);
return 0;
}
【51Nod】1510 最小化序列 贪心+动态规划的更多相关文章
- 51nod 1510 最小化序列 | DP 贪心
题目描述 现在有一个长度为n的数组A,另外还有一个整数k.数组下标从1开始. 现在你需要把数组的顺序重新排列一下使得下面这个的式子的值尽可能小. ∑|A[i]−A[i+k]| 特别的,你也可以不对数组 ...
- UVA 714 Copying Books 最大值最小化问题 (贪心 + 二分)
Copying Books Before the invention of book-printing, it was very hard to make a copy of a book. A ...
- 【BZOJ1046】上升序列(动态规划,贪心)
[BZOJ1046]上升序列(动态规划,贪心) 题面 BZOJ 洛谷 题解 我一开始看错题了,一度以为是字典序最小的序列. 最后发现它要求的字典序是位置的字典序最小. 那就很好办了. 设\(f[i]\ ...
- UVa 714 Copying books 贪心+二分 最大值最小化
题目大意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相 ...
- POJ3273-Monthly Expense (最小化最大值)
题目链接:cid=80117#problem/E">click here~~ [题目大意] 农夫JF在n天中每天的花费,要求把这n天分作m组.每组的天数必定是连续的.要求分得各组的花费 ...
- UVA714- Copying Books(最大最小化)
意甲冠军:k手稿的部分成m部分,使每一个和最小 思路:典型最大值最小化问题,使用贪心+二分. 贪心的是每次尽量将元素往右边划分,二分查找最小的x满足m个连续的子序列和S(i)都不超过x. 由于输出的原 ...
- Effective Java 第三版——17. 最小化可变性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 【BZOJ1489】[HNOI2009]双递增序列(动态规划)
[BZOJ1489][HNOI2009]双递增序列(动态规划) 题面 BZOJ 洛谷 题解 这\(dp\)奇奇怪怪的,设\(f[i][j]\)表示前\(i\)个数中,第一个数列选了\(j\)个数,第二 ...
- poj_3662 最小化第k大的值
题目大意 有N个节点以及连接的P个无向边,现在要通过这P条边从1号节点连接到N号节点.若无法连接成功,则返回-1:若能够连接成功,那么其中用到了L条边,这L条边中有K条边可以免费,L-K条边不能免费, ...
随机推荐
- unity2D背景移动补偿从而获得3d错觉效果
2d平台跳跃游戏当相机移动的时候背景跟随进行微调移动,从而使得玩家获得3d的错觉 using System.Collections;using System.Collections.Generic;u ...
- 绕过用编码方式阻止XSS攻击的几个例子
阻止攻击的常用方法是:在将HTML返回给Web浏览器之前,对攻击者输入的HTML进行编码.HTML编码使用一些没有特定HTML意义的字符来代替那些标记字符(如尖括号).这些替代字符不会影响文本在web ...
- JS高级程序设计学习笔记1
javascript产生的原因: 在拨号上网时代,表单数据必须发送到服务器端才能验证输入值得有效性,JavaScript的研发就是为了解决这个问题,以便在客户端就验证输入值的有效性. ECMAScri ...
- Daily Scrum - 12/07
Meeting Minutes 确认基本完成了UI组件的基本功能的动画实现: 准备开始实行UI组件的合并: 讨论了长期计划算法的难点,以及简单版本的实现方案. 督促大家更新TFS: Burndown ...
- Beta阶段综合报告
一. 敏捷冲刺每日报告 http://www.cnblogs.com/mia0502/p/7767628.html http://www.cnblogs.com/mia0502/p/7773872.h ...
- Objective-C语言--self和super关键字解析
看代码: @implementation Son : Father - (id)init{ self = [super init]; if (self){ } return self; } self是 ...
- Hyper-V下WINXP无网卡问题解决
- 在PHPStorm中快速插入当前日期
在EditPlus中使用快捷键Ctrl+D即可插入当前日期,但在PHPStorm中似乎没有这样的快捷键,那如何实现快速插入当前日期呢?其实很简单,跟我做一遍你就会了: 目标 为PHPStorm定义一个 ...
- [转帖]ESXi、Linux、Windows获取机器序列号的方法
http://blog.51cto.com/liubin0505star/1717473 windows: wmic bios get serialnumber linux: dmidecode准确一 ...
- Linux 备份 文件夹的权限 然后在其他机器进行恢复
Study From https://www.cnblogs.com/chenshoubiao/p/4780987.html 用到的命令 getfacl 和 setfacl 备份 getfacl -R ...