摘要: 题意:从N部电影中选M部看,每部都有不同的时长和价值,问是否可以看完M部电影,可以的话求价值的最大值,否则输出0.分析:这是有两重费用的01背包,其实原本就是在01背包的基础上加多一维就可以了。这题主要卡在"If DuoDuo can’t watch all of the movies that her uncle had bought for her, please output 0.",因此每个Knapsack[费用][费用]都是要刚刚好用到这么多,因此在输出的时候答案不一定是Knapsack[m][l],而是在Knapsack[m][?]里的其中一个。#include 阅读全文
posted @ 2013-05-08 19:51 Hogg 阅读(348) 评论(0) 推荐(0) 编辑
摘要: 题意:求一个点集中的两个点的最远距离的平方。分析:点集可以先用Graham-scan求凸包,再用Rotating Caliper求多边形外接圆直径。注意旋转卡壳中具体是先固定一条边,作为三角形的底边,再依次枚举除这两个点之外的其他点(逆时针顺序),用叉积求三角形的面积,面积最大时表明边与点的距离最远。#include <cstdio>#include <cmath>#include <algorithm>#define vector pointusing std::sort;using std::swap;using std::max;const doubl 阅读全文
posted @ 2013-05-08 16:40 Hogg 阅读(528) 评论(0) 推荐(0) 编辑
摘要: 题意:ACBoy有m天时间去学习n门课程,矩阵a中的元素a[i][j]表示用j天时间去学习课程i的收获。求最大收获。分析:背包题。01背包的基础上在最里面的循环加一个循环计算用各种天数学习第i门课程的收获即可。#include <cstdio>#include <algorithm>using std::max;int main(){ int n,m,knapsack[101],a[101][101]; while(scanf("%d%d",&n,&m) && (n || m)) { for(int i = 1;i & 阅读全文
posted @ 2013-05-08 15:42 Hogg 阅读(317) 评论(0) 推荐(0) 编辑