noj[1581] 筷子
题目描述
A先生有很多双筷子。确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的。这天,A先生家里来了K个客人,A先生留下他们吃晚饭。加上A先生,A夫人和他们的孩子小A,共K+3个人。每人需要用一双筷子。A先生只好清理了一下筷子,共N根,长度为T1,T2,T3,……,TN.现在他想用这些筷子组合成K+3双,f使每双的筷子长度差的平方和最小。(怎么不是和最小??这要去问A先生了,呵呵)
输入
输入文件共有两行,第一行为两个用空格隔开的整数,表示N,K(1≤N≤100, 0<K<50),第二行共有N个用空格隔开的整数,为Ti.每个整数为1~50之间的数。
输出
输出文件仅一行。如果凑不齐K+3双,输出-1,否则输出长度差平方和的最小值。
样例
CHOP.IN
CHOP.OUT
说明
第一双 1 1
第二双 2 3
第三双 3 3
第四双 4 6
(1-1)^2+(2-3)^2+(3-3)^2+(4-6)^2=5
题解
先判断是否能凑齐k+3双筷子。
把n双筷子排序后,相邻的筷子一定排在一起。
那么,设f[i][j]表示1~j根筷子组成i双的最小平方差之和
再把问题分为取和不取两种情况,
1)继承前1~j-1根筷子组成i双的最小平方差之和
2)从1~j-1根筷子组成i-1双的最小平方差之和来推导
因此,状态转移方程为:
f[i][j]=min{f[i][j-1],f[i-1][j-2]+(len[j]-len[j-1])*(len[j]-len[j-1])}
#include<stdio.h>
#include<memory.h>
#define sq(x) ((x)*(x))
#define dmin(a,b) ((a)<(b)?(a):(b))
using namespace std;
bool flag;
int n,k,t[],d[],f[][];
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
int x;
scanf("%d",&x);
t[x]++;
}
k+=;
if((n>>)<k){
puts("-1");
return ;
}
for(int i=;i<=;i++)
for(;t[i];t[i]--)
d[++d[]]=i;
memset(f,,sizeof(f));
f[][]=;
for(int i=;i<=k;i++)
for(int j=;j<=d[];j++)
f[i][j]=dmin(f[i][j],dmin(f[i-][j-]+sq(d[j]-d[j-]),f[i][j-]));
printf("%d\n",f[k][d[]]);
return ;
}
noj[1581] 筷子的更多相关文章
- 动态规划之 <筷子>
描述 A 先生有很多双筷子.确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的.这天,A 先生家里来了K 个客人,A 先生留下他们吃晚饭.加上A 先生,A夫人和他们的孩子小A,共K+3 ...
- NOJ-1581 筷子 (线性DP)
题目大意:有n支筷子,已知长度,定义一双筷子的质量等于长度的平方差,问能否分成k双?若能,输出所有筷子的最小质量和. 题目分析:先将筷子按长度从小到大排序,定义状态dp(i,j)表示将前 i 支筷子分 ...
- CSU - 1581 Clock Pictures (KMP的变形题,难想到)
题目链接: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1581 题目意思:告诉你现在有两个钟,现在两个钟上面都有n个指针,告诉你指针的位置, ...
- 洛谷——P1469 找筷子
P1469 找筷子 题目描述 经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘 ...
- 洛谷P1469找筷子
题目描述 经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题,筷子!CX ...
- 洛谷 P1469 找筷子
题目描述 经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题,筷子!CX ...
- caioj 1077 动态规划入门(非常规DP1:筷子)
首先可以看出排序之后,最优解肯定是每一对都相邻才是最优的 那么我们就要找构成最优解的相邻组 设f[i][j]是前i个字符,k对的最小值 如果当前这个筷子不取的话,f[i][j] = f[i-1][j] ...
- whu 1581 Union of cubes
题目链接: http://acm.whu.edu.cn/land/problem/detail?problem_id=1581 ------------------------------------ ...
- 集训作业 洛谷P1469 找筷子
这个题的代码真的是短的不得了呢. 有个神奇的东西叫异或,写起来是这个样子的^. 这个东西可以查看2个数的二进制某位是否相同,相同取0,不同取1.虽然我用的不熟,但我可以想出来,如果2个相同的数异或,答 ...
随机推荐
- 为Autodesk Viewer添加自定义工具条的更好方法
上一篇文章中我介绍了使用Autodesk Viewer的UI API来给viewer添加自定义工具条的方法,看起来很简单是吧.不过有个问题,就是关于自定义工具条的信息(包括按钮的文本.图标.样式.ca ...
- -[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 解决方法
-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 解决方法: 错误:NSMutableD ...
- [Android]使用Kotlin+Anko开发Android(一)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4800656.html Kotlin是由JetBrains开发 ...
- 在GitHub上管理项目
在GitHub上管理项目 新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git ...
- android加固系列—4.加固前先学会破解,无源码调试apk
[版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5138585.html] 项目关键java代码为,将tv设置为从jni读取的字符串,这里的破解内 ...
- 【iOS】环形渐变进度条实现
之前有人在找渐变进度条的效果,闲来无事就顺手写了一个,然后画了视图层级,方便讲解. 环境信息: Mac OS X 10.10.3 Xcode 6.3.1 iOS 8.3 效果图: 源码下载地址: ht ...
- 苹果IPSW文件提取软件
ipsw文件 提取系统文件 方法总结 由于修改运营商文件造成我的有锁4S无法使用移动卡了,在网上苦寻一番还是没有结果,最后萌生了从固件中提取文件的想法,于是便开始在网上搜集资料,最后文件终于提取成功并 ...
- C#复习⑦
C#复习⑦ 2016年6月22日 11:50 Main Exception & Namespaces & Assemblies 异常 & 命名空间 & 程序集 1.tr ...
- MySQL 数据库双向镜像、循环镜像(复制)
在MySQL数据库镜像的贴子中,主数据库A 的数据镜像到从数据库B,是单向的,Zen Cart网店的数据读写都必须在数据库A进行,结果会自动镜像到数据库B中.但是对数据库B的直接操作,不会影响数据库A ...
- CYQ.Data 数据框架 使用篇一 入门指南
快速使用帮助 | 回贴(13) | 浏览(11303) | 发表日期 :2010-12-20 20:12:29 #楼主 本文针对V5版本进行修改于(2016-07-04) 下面是使用步骤: 一 ...