九度oj 题目1452:搬寝室
- 题目描述:
-
搬寝室是很累的,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:搬寝室的更多相关文章
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- JAVA-WEB总结02
1 什么是JavaBean?有何特征? 1)符合特定规则的类 2)JavaBean分二类: a)侠义的JavaBean .私有的字段(Field) .对私有字段提供存取方法(读写方法) ...
- [论文理解] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications Intro MobileNet 我 ...
- ansible 通过堡垒机/跳板机 访问目标机器需求实战(ssh agent forward)
一. 需求背景: 在我们使用ansible的过程中经常会遇到这样的情况,我们要管理的机器都在内网中,这些内网机器的登录都是通过跳板机或者堡垒机登录.我们的ansible机器不能直接管理到这些后端的机器 ...
- 在CNN中使用Tensorflow进行数据增强
开始之前,需要思考一些基本问题 1.为什么需要大量数据 当您训练机器学习模型时,您真正在做的是调整其参数,以便它可以将特定输入(例如,图像)映射到某个输出(标签).我们的优化目标是追逐我们模型损失较低 ...
- SpringMVC-常用的注解
1. RequestParam注解 把请求中的指定名称的参数传递给控制器中的形参赋值 value:请求参数中的名称 require:请求参数中是否必须提供此参数,默认值是true,必须提供 2. Re ...
- 怎么在WEBSTORM中设置代码模板 Live Templates
怎么在WEBSTORM中设置代码模板 Live Templates setting 里面 https://www.cnblogs.com/xinzaimengzai/p/9938464.html
- 使用ServiceController组件控制计算机服务
实现效果: 知识运用: ServiceController组件的MachineName属性 //获取或设置服务所驻留的计算机名称 public string MachineName{get;set;} ...
- 剑指offer15 链表中倒数第k个结点
错误代码 class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { ) retur ...
- java static block
java 中 静态块的作用 (一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在 ...
- SQL数据库中各种字段类型的说明
(1)char.varchar.text和nchar.nvarchar.ntext char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是 ...