HDU 1421 搬寝室 解题报告
2013-09-20 17:42
267 查看
搬寝室
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13414 Accepted Submission(s): 4533
[align=left]Problem Description[/align]
搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2*k件过去就行了.但还是会很累,因为2*k也不小是一个不大于n的整数.幸运的是xhd根据多年的搬东西的经验发现每搬一次的疲劳度是和左右手的物品的重量差的平方成正比(这里补充一句,xhd每次搬两件东西,左手一件右手一件).例如xhd左手拿重量为3的物品,右手拿重量为6的物品,则他搬完这次的疲劳度为(6-3)^2
= 9.现在可怜的xhd希望知道搬完这2*k件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧.
[align=left]Input[/align]
每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).
[align=left]Output[/align]
对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.
[align=left]Sample Input[/align]
2 1
1 3
[align=left]Sample Output[/align]
4
[align=left]Author[/align]
xhd
解题思路:
题目意思为求n个物品,拿k对使得消耗的体力最少,或者说是这k对物品,每一对中两件物品的质量差平方最小,所以要使得质量差的平方小,只能排序后取质量相邻两个物品作为一对;
现在设f[i][j]为前i件物品组成k对所消耗的体力最小;
这时分两种情况含有第i件物品和不含有第i件物品(即第i件物品是不是含在第j对里)
1.含有i件物品 则有 f[i][j]=f[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]);
2.不含第i件物品则有 f[i][j]=f[i-1][j];
所以动态转移方程为:f[i][j]=minn(f[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]), f[i][j]=f[i-1][j]);
代码如下:
#include <stdio.h> #include <stdlib.h> #define size 2005 #define INIF 2147483646 int f[size][1005]; int minn(int a,int b) { return a<=b?a:b; } int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b;// 从小到大排序 } int main() { int n,k,i,j; int val[size]={0}; f[0][0]=0; while(scanf("%d%d",&n,&k)!=EOF) { val[0]=0; for(i=1; i<=n; i++) scanf("%d",&val[i]); qsort(val+1,n,sizeof(val[0]),cmp); for(i=0; i<=n; i++) for(j=1; j<=k; j++) f[i][j]=INIF; for(i=2; i<=n; i++) for(j=1; j*2<=i; j++) f[i][j]=minn(f[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]),f[i-1][j]); printf("%d\n",f [k]); } return 0; }
相关文章推荐
- hdu 1421 搬寝室 解题报告
- HDU - 1421 搬寝室 解题报告
- HDOJ 1421:搬寝室 解题报告
- HDU 1087 解题报告
- 【解题报告】 HDU 1698 Just a Hook 线段树 (线段替换) 插线问线 + 延时标记
- HDU 4371 Minimum palindrome 解题报告(找规律)
- hdu 1421 搬寝室 (dp)
- hdu 5821 2016 Multi-University Training Contest 8 Ball 解题报告
- HDU - 1087 Super Jumping! Jumping! Jumping! 解题报告
- 最小生成树,POJ和HDU几道题目的解题报告(基于自己写的模板)
- HDU 1.1.6解题报告
- hdu 4520 小Q系列故事——最佳裁判 解题报告
- Hdu 1754 I Hate It 线段树 解题报告
- hdu 4528 小明系列故事——捉迷藏 bfs 解题报告
- The sum problem(hdu 2058)解题报告
- 解题报告:HDU 4111 Alice and Bob 递推|博弈
- hdu 1421(搬寝室)
- hdu 4647 Another Graph Game 贪心 解题报告
- HDU 1853 Cyclic Tour(二分图最优匹配) 解题报告
- hdu 2031 解题报告