摘要: 题意:爱丽丝喜欢拍电影,现在正好有N个公司找她拍电影,每部电影都指定在每周的星期几拍,要用D天拍完电影,最迟M个星期要拍完.问爱丽丝能不能拍完所有电影.分析:350天各为一个顶点,每个顶点都有且只有一条边指向汇点t,容量为1,源点为爱丽丝,指向每部电影,权值为该部电影拍完的天数D,每部电影都向能拍这部电影的那一天的顶点建一条权值为1的边.如果计算出来的最大流为所有电影要拍的天数的总和则能够拍完所有电影,否则不能. 1 #include 2 #include 3 const int MAXN=375;//点数的最大值 4 const int MAXM=14740;//边数的最大值 ... 阅读全文
posted @ 2013-08-01 16:16 Hogg 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 题意:假如存在矩阵A,A[i][0] + A[i][1] + ...... + A[i][n - 1] == SR[i],A[0][j] + A[1][j] + ...... + A[n - 1][j] == SC[j].(0 #include const int MAXN=205;//点数的最大值const int MAXM=25005;//边数的最大值const int INF=0x3fffffff;struct Node{ int from,to,next; int cap;}edge[MAXM];int tol;int head[MAXN];int dep[MAXN];in... 阅读全文
posted @ 2013-08-01 10:25 Hogg 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 题意:求XY平面上最左边的点到最右边的点的最大流。分析:数据量大,EK算法TLE,要用SAP算法。SAP算法用的是http://www.cnblogs.com/kuangbin/archive/2012/09/29/2707955.html的模板。#include #include const int MAXN=100005;//点数的最大值const int MAXM=200005;//边数的最大值const int INF=0x3fffffff;struct Node{ int from,to,next; int cap;}edge[MAXM];int tol;int head... 阅读全文
posted @ 2013-07-31 16:34 Hogg 阅读(333) 评论(0) 推荐(0) 编辑
摘要: 题意:给你一个n*n的格子的棋盘,每个格子里面有一个非负数。从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。分析:定理:最大点权独立集 =总权值 - 最小割 =总权值 - 最大流。可以把所有方格分成两个集合,再构造一个源点和一个汇点,源点向其中一个集合中的所有元素都有一条有向边,权值为元素的权值,另一个集合中的所有元素都分别有一条有向边指向汇点,权值为该元素的权值,两个集合之间也构造有向边,由源点集合的点指向汇点集合的点,权值为无穷大。 1 #include 2 #include 3 #define M 405 4... 阅读全文
posted @ 2013-07-31 09:46 Hogg 阅读(470) 评论(0) 推荐(0) 编辑
摘要: 题意:给出一张n*m的地图,'H'表示高地,不能部署炮兵,'P'表示平原,可以部署炮兵,炮兵之间必须保持横向、纵向至少2个格子的距离,保证没有误伤。问最多可以部署多少炮兵。分析:1.可以用一个32位整数存每一行的状态(二进制上1表示有布置炮兵,0表示没有布置炮兵),由于每一行的状态都要前两行的状态来决定,因此真正的一个状态应该包含本行的状态和上一行的状态,用dp[x][i][j]表示第x行上状态i,x-1行状态为j的最优解。2.每一行的状态其实只有60种,可以直接暴力搜索出来,把这60种状态按二进制递增顺序(排序目的是方便确定状态没有超出n*m的范围)存到数组s 阅读全文
posted @ 2013-05-11 11:21 Hogg 阅读(1679) 评论(0) 推荐(0) 编辑
摘要: 题意:把价值为1,2,3,4,5,6的宝石平均分成两份,不能切割,有没有办法分开。分析:多重背包。之前直接用01背包的方法做78ms,然后想试试用二进制优化,看看能跑多少。发现,用二进制反而变421ms。#include <cstdio>int main(){ int marble[7],p = 1; bool knapsack[120000]; while(true) { int sum = 0; for(int i = 1;i <= 6;i++) { scanf("%d",&marble[i]); ... 阅读全文
posted @ 2013-05-10 11:05 Hogg 阅读(596) 评论(0) 推荐(0) 编辑
摘要: 题意:从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) 编辑
摘要: 题意:计算多边形核的面积。分析:半平面交的模板。有两个问题要注意,1.题目没说多边形点的顺序是顺时针还是逆时针,要先用面积的正负来判断点的顺序。2.题目中说坐标都在16位整数范围内,也就是说半平面交模板中初始的无限大平面的四个顶点设为±1e5就可以了,原本设为±1e15无限WA。#include <cstdio>#include <algorithm>#define vector pointusing std::swap;struct point{ double x,y; point(double xx = 0,double yy = 0) { x 阅读全文
posted @ 2013-05-07 15:29 Hogg 阅读(428) 评论(0) 推荐(0) 编辑