摘要:部分背包问题,贪心 先按J[i] / F[i] 升序排序,每次选取J[i] / F[i]的最大值,如果不能取满J[i],则取把背包填满的容量即可。原因很简单,每次取J[i] / F[i]的最大值就使得背包单位体积价值最多。从大到小选择,自然会得到最优解。 #include <iostream>#include <algorithm>#include <cstdio>using namespace...
阅读全文
摘要:这题就是任务调度,给定任务的起始和结束时间,求能完成任务的最大数目。 贪心,先按任务的结束时间递减排序,再逐个选择。选择活动的起始时间大于已选择活动的结束时间 #include <iostream>#include <cstdio>#include <vector>#include <algorithm>using namespace std;const int N = 50005;struct...
阅读全文
摘要:题目给出蛇形矩阵,要求计算给定的值在蛇形矩阵的位置。 注意到,矩阵的右上角的值是某个奇数的平方,从内到外依次是1,3,5…的平方。先求出要求的数对应的右上角的数的坐标,再根据与距离来计算指定数的坐标 #include <iostream>#include <cstdio>using namespace std;int n, m;void find(){ int place_zero = n/2+...
阅读全文
摘要:这题有些像求连续子序列和的最大值 设dp[i][j]表示i个火车头拉动j个火车舱的人数和的最大值,状态方程如下:dp[i][j] = max(dp[i-1][j-times]+num[j]+..+num[j-times+1], dp[i][k]) #include <iostream>#include <cstdio>#include <cstring>using namespace std;c...
阅读全文
摘要:这题想了很久,虽然知道是01背包,但加了两个约束条件后,就不知道如何做了。 直到看到解题报告才懂这题思路。先定死一个变量,求另外一个变量,得到各个结果再找出最优解。 设dp[i][v]为前i头牛给定smart为v时的最大fun值之和。就可以转化为01背包。 dp[i][v] = max(dp[i-1][v-s[i]] + f[i], dp[i-1][v])。注意由于smart可以是负的,要把sm...
阅读全文
摘要:这题做得相当顺利,1A 题意是求夫妇两人洗完衣服用的最小时间。先按衣颜色分类,对于每种颜色的衣服,最优解是都平分即V/2,背包容量为洗衣服的花费,用01背包来标记是否可以通过组合组成某个容量。若不能平均分,就从V/2开始搜索,最接近V/2的较大值就为两人洗完每种颜色衣服的最短时间,把各种颜色衣服的解加起来即为答案 #include <iostream>#include <map>#include...
阅读全文
摘要:这题以前是母函数做的,今天看了DD的背包九讲,该用背包模型做。 这题是完全背包。设dp[i][v] 为用前i个数组成v的方案数,状态方程如下:dp[i][v] = sum(dp[i-1][v-k*i]) #include <iostream>using namespace std;const int N = 122;//dp[i][v] 为用前i个数组成v的方案数//dp[i][v] = sum...
阅读全文
摘要:寒假结束了,新学期将要开始了。上学期,一个字总结——宅。寒假,总结也是——宅。放假一个月来都宅在家了,每天都重复着看书做题。新的学期,给自己定义目标:好好学习,好好看书,好好做题,好好学英语。不想再搞项目了。那三本厚厚的教材光看到都蛋疼了,这个学期的任务还是很重的况且这学期的课程感觉蛮重要的。
阅读全文
摘要://这题的方程不会列,看了别人解题报告才懂 //设dp[i][j]为i段以a[j]结尾子序列的最大和 //dp[i][j] = max(dp[i][j-1]+a[j], dp[i-1][k]+a[j]) //由于题目规模巨大,不能使用二维数组存,需要优化 //经分析,可以优化成两个一维数组 //dp[j]为以a[j]结尾的子序列最大和,pre[j]则是记录前个段(即第i-1段)到a[j-1]为止的...
阅读全文
摘要:根据性别分为两个集合,然后求最大独立集。由于题目没有给出性别,可以不划分集合,每个集合都为n个,求最大匹配数,最后除2即可。
阅读全文
摘要:开始误解了题目意思,认为观众留下是要同时满足两个条件。后来看了解题报告才明白过来。当观众想要留下来的宠物出局时,这个观众才认为会离开 。 以cat_lover和dog_lover把观众分为两个集合。只要两个集合内的人的选择有冲突,这两个顶点连接,边代表矛盾,然后求最大独立集。 最大独立集 = 顶点数 - 最小顶点覆盖数(最大匹配数)
阅读全文
摘要:构图方式如下: 以row行号作为x集合顶点, col行号作为y集合顶点,根据题目给出的坐标x,y用边连接X,Y集合的顶点,求最小点覆盖数
阅读全文
摘要:转换成求最小点覆盖数 构图方式如下:横行的连续*方块作为X集合里的顶点,纵行的连续*方块作为Y集合的顶点,若两个方块相交,则用边把这两个顶点相连。然后求最小点覆盖数(求最大匹配),即为答案。 要注意构图后的顶点数。
阅读全文
摘要:转换成最大匹配。 每个横向的'o’和'#’块(必须包含'o’)作为X集合一个顶点,每个纵向的'o’和'#’块(必须包含'o’)作为Y集合一个顶点 当横向块和纵向块的交点的'o’时,二分图该两个顶点有边相连接。 这题因为下标不小心打错了,调了很久才ac,纳闷。
阅读全文
摘要:别人都说是赤裸裸的最小费用流,自己想了很久,都想不到如何做,最后看了别人解题报告才懂。 关键还是在构图和转化。源点是1,添加一个汇点,汇点到各个城市的边的容量是各个城市卖啤酒的钱的相反数。通过spfa求cost的最短路径,若最短路径的cost小于0,说明这条路径是赚钱的,否则是亏本的,算法停止。
阅读全文
摘要:求二分图最小权匹配,转换成最大权匹配。 方法一,初始化边e为负的权值,取反输出答案; 方法二,lx[]用min初始化,求slack时用max, 从最小值逐渐增大。 感觉二分图最大权匹配的思想与差分约束求最大值有些像。 差分约束求最大值一直保持d[u] <= d[v]+ e(u, v),而最大权匹配则是通过顶标,先从最大的权值边匹配,若不能构成完全匹配,就在相等子图里添加边。都是...
阅读全文