题目描述:

搬寝室是很累的,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件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧。

输入:

每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).

输出:

对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.

样例输入:
2 1
1 3
样例输出:
4

这个题一开始就觉得是用动态规划来做。但到底怎么样去使用,还是没有想出来。看了看别人的代码
dp[n][k] 表示从前n个物品中选出2*k个物品的最小疲劳度
若先对物品进行排序,发现相邻的两个肯定是差最小的,故对第i件物品,若不选第i件物品
则dp[i][j] = dp[i-1][j] 前提是2*j <= i-1
否则若选则第i件物品,则与它的差最小的则是第i-1件物品,那么第i-1件物品也应被选择
dp[i][j] = dp[i-2][j-1] + (w[i]-w[i-1])*(w[i]-w[i-1])
另外就是初始化的问题,这个是个令人头疼的问题
代码如下
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; int n, k;
int w[]; int cmp(int a, int b) {
return a < b;
} int dp[][];
int main(int argc, char const *argv[])
{
while(scanf("%d %d",&n,&k) != EOF) {
for(int i = ; i <= n; i++) {
scanf("%d",&w[i]);
}
sort(w+, w++n, cmp);
memset(dp, -, sizeof(dp));
dp[][] = (w[]-w[])*(w[]-w[]);
for(int i = ; i <= n; i++) {
dp[i][] = ;
}
for(int i = ; i <= n; i++) {
for(int j = ; j<= k && *j <=i; j++) {
if(dp[i-][j] == -) {
dp[i][j] = dp[i-][j-] + (w[i]-w[i-])*(w[i]-w[i-]);
}
else {
dp[i][j] = min(dp[i-][j], dp[i-][j-] + (w[i]-w[i-])*(w[i]-w[i-]));
} //printf("%d ",dp[i][j]);
}
// puts("");
}
printf("%d\n",dp[n][k]);
}
return ;
}

一开始的代码如下

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; int n, k;
int w[]; int cmp(int a, int b) {
return a < b;
} int dp[][];
int main(int argc, char const *argv[])
{
while(scanf("%d %d",&n,&k) != EOF) {
for(int i = ; i <= n; i++) {
scanf("%d",&w[i]);
}
sort(w, w+n, cmp);
memset(dp, -, sizeof(dp));
dp[][] = (w[]-w[])*(w[]-w[]);
for(int i = ; i <= n; i++) {
dp[i][] = ;
}
for(int i = ; i <= n; i++) {
for(int j = ; j<= k && *j <=i; j++) {
if(dp[i-][j] == -) {
dp[i][j] = dp[i-][j-] + (w[i]-w[i-])*(w[i]-w[i-]);
}
else {
dp[i][j] = min(dp[i-][j], dp[i-][j-] + (w[i]-w[i-])*(w[i]-w[i-]));
} //printf("%d ",dp[i][j]);
}
// puts("");
}
printf("%d\n",dp[n][k]);
}
return ;
}

第22行有错误,因为w下标从1开始,所以排序时你的下标不能从0开始

九度oj 题目1452:搬寝室的更多相关文章

  1. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  2. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  3. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. pycharm使用秘籍 和 pip命令

    python使用requirements.txt批量安装包 requirements.txt文件格式: requests==1.2.0  Flask==0.10.1 等等一系列包 cd 到requir ...

  2. 检查EXE、DLL、SYS等文件是32位还是64位的

    非.NET文件用:dumpbin.exe /headers file.exe(C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin) . ...

  3. 到底什么样的ABAP系统能运行Fiori应用

    有朋友在微信上问我两个问题: S/4 fiori是标配吗? 如果是ERP R/3,可以激活fiori配置吗? 先回答第二个问题. 在Jerry的微信公众号文章SAP Fiori应用的三种部署方式曾经提 ...

  4. MYSQL内置函数总结

    时间转换为字符串: SELECT date_format(Date, '%Y-%m-%d %H:%i:%s' ) AS TimeFROMtable o convert函数转换为字符串的时候不存在类型为 ...

  5. Codeforces Round #321 (Div. 2) B. Kefa and Company (尺取)

    排序以后枚举尾部.尺取,头部单调,维护一下就好. 排序O(nlogn),枚举O(n) #include<bits/stdc++.h> using namespace std; typede ...

  6. ios sinaweibo 客户端(三)

    这个页面要讲述的是用户的粉丝列表,下面是效果图: 可以看到这个视图明显也是一个tableview,在每一个cell中包含的有三个部分的内容:粉丝头像image,粉丝昵称label,我和粉丝之间的相互关 ...

  7. VS快捷键总结(开发中经常遇到)

    1.窗口快捷键  (大家有没有发现但凡跟窗口挂上钩的快捷键当中都有一个W,那是因为W代表Windows也就是窗口的意思) Ctrl+W,W: 浏览器窗口 (浏览橱窗用有道的翻译是window shop ...

  8. VIM 编辑器 -使用详解记录

    1.什么是 vim? Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但 ...

  9. k8s搭建WebUI--Dashborad管理界面

    k8s的webUI管理界面可以更好更直观更便捷的让我们去管理我们的k8s集群. 我们知道,由于某些原因我们无法直接拉取dashboard的镜像,但是国内有些人已经将镜像下载到dockerhub中可以给 ...

  10. 04Windows中的字符类型

    1. Windows 中常用的数据类型定义 //WinNt.h中定义 typedef unsigned short wchar_t; //A 16-bit character typedef char ...