- 博客(40)
- 收藏
- 关注
原创 图论之最小生成树
最小生成树的题目比较模式化,一般模板即可解决问题。Prim:#include#include#include#include#include#define maxn 1000#define INF 0x7f7f7f7fusing namespace std;struct Edge{ int dist,to; bool operator < (Edge rhs) const
2016-05-31 12:35:11 366
原创 poj之旅——1258,2377,2395
最小生成树的题目一般比较死板,模板题。题目描述:直接看样例即可知道如何读入,除了2395是求最大边,其他均为和。参考程序:1258:#include#include#include#include#define INF 0x7f7f7f7f#define maxn 1050using namespace std;struct Edge{ int dist,to;
2016-05-30 18:36:13 182
原创 poj之旅——3259,3268
基础模板题。3259:#include#include#include#define maxm 10000#define INF 0x3f3f3f3fint d[maxm];int cnt,n,m,w;struct Edge{ int from,to,dist;}e[maxm];void addedge(int u,int v,int w){ e[cnt].from=u;
2016-05-30 12:38:43 224
原创 图论之最短路问题
此种题型最为经典,可以有多种变化形式,但最终所需的模板总是万变不离其宗,这里复习一下模板,并有所改变。Dijsktra:#include#include#include#include#include#define INF 0x7f7f7f7f#define maxn 100000using namespace std;int n,m;struct Edge{ int fr
2016-05-28 22:44:22 438
原创 poj之旅_2184
题目描述:有N头奶牛想参加CJ,每头奶牛的智商分别为S_i,情商为F_i。欲挑出一群奶牛使得S之和与F之和都不为负数,且SF之和最大,求此最大值题解:01背包,把S看成包重,F看成价值。注意C中没有下标为负的数组,只好将数组右移足够大的单位,注意要分S的正负讨论。参考程序:#include#include#includeusing namespace std;int f[1
2016-05-27 13:07:17 208
原创 poj之旅——2139
题目描述:N头牛,拍了M部电影,同一部电影中的搭档们距离1,求最小度数之和题解:floyd。参考程序:#include#include#include#define maxn 500using namespace std;int d[maxn][maxn];int x[maxn];int main(){ int V,M; scanf("%d %d",&V,
2016-05-27 12:45:23 244
原创 poj之旅——2236,1703
题目描述:有N台电脑坏了,它们原本组成这样一个局域网:距离d内的两台电脑互联。现在通过修理和查看操作,求查看时两台电脑是否互联题目描述:有N名来自两个帮派的坏蛋,已知一些坏蛋两两不属于同一帮派,求判断给定两个坏蛋是否属于同一帮派题解:并查集的基本应用,直接看程序。参考程序:2236:#include#include#include#includeus
2016-05-27 12:36:02 201
原创 poj之旅——2010(队列)
题目描述:奶大招生,从C头奶牛中招收N头。它们分别得分score_i,需要资助学费aid_i。希望新生所需资助不超过F,同时得分中位数最高。求此中位数题解:先将奶牛排序,考虑每个奶牛作为中位数时,比它分数低(前面的)的那群牛的学费总和lower_i,后面的总和upper_i。然后从分数高往分数低扫描,满足aid_i + lower_i + upper_i 参考程序:#i
2016-05-27 12:33:32 630
原创 poj之旅——3614
题目描述:有C头奶牛日光浴,每头奶牛分别需要minSPF_i和maxSPF_i单位强度之间的阳光。现有L种防晒霜,分别能使阳光强度稳定为SPF_i,其瓶数为cover_i。求最多满足多少头奶牛题解:首先得确定一个贪心策略,在满足minSPF的条件下,尽量把SPF小的防晒霜用在maxSPF小的奶牛身上,因为maxSPF大的奶牛有更大的选择空间。用一个最小堆q维护maxSPF的最小值,可以
2016-05-27 12:31:10 378
原创 登封造极之字符串——后缀数组
定义:给出字符串T,将T的所有后缀(包括空串和本身)排序后,得到一个顺序,定义sa[i]数组表示第i小的后缀是从T的哪个位置开始的,如:T=aabcd则有sa={0,1,2,3,4,5}构建:直接模拟,得出所有的后缀快排,则O(n^2*log n) 效率不够,定义S[i,k]表示从第i个位置开始的长度为k的字符串,rank[i,k]表示在所有排好序的S[i,k]
2016-05-26 13:03:06 927
原创 登封造极之数论——闯入模世界
基本问题:ax+by=gcd(a,b)关键点:a^-1(a的模逆元)*a=1(mod b),只要解出a的逆元,问题就可以迎刃而解了。原理1:费马小定理:a^p(p是质数)=a(mod p) 变形:a^(p-1)=1(mod p) a^(p-2)*a=1(mod p) 所以:a^-1=a^(p-2)(m
2016-05-26 12:29:09 968
原创 poj之旅——2392
题目描述:奶牛们想用c_i个高h_i的积木造通天塔,每种积木所在的高度不能高过a_i,求塔的最大高度题解:明显的多重背包,可以简单的定义,当然我选择先前的优化后的递推式,即dp[i][j]:用前i种block搭到j高度时第i种剩下的最多块数,不存在为-1; dp[i][j] = { c[i]; ( dp[i-1][j] >= 0 ) { dp[i]
2016-05-24 12:58:27 241
原创 poj之旅——3666
题目描述:农夫约翰想修一条尽量单调的路,路的每一段海拔是A_i,修理后是B_i,花费|A_i – B_i|,求最小花费题解:定义:dp[i][j] := 前i个数变成单调且最后一个数是B[j],此时的最小成本 设原数组为a,则b为a排序后的数组。 则有:dp[i][j] = min(dp[i – 1][k]) + |A[i] – B
2016-05-24 12:54:23 273
原创 poj之旅——1631
题目描述:新来的实习生把路由线路搞得一团糟!如图,原本左右端口应当按顺序连接。现在只有切除部分线路,使得任何线路都不相交。希望你写一个程序计算最后剩下多少线路?题解:题目的读入很坑,只要求读入一边顺序的即可,通过图片可以很清晰的看出,题目要求最长上升子序列,dp,O(n^2),二分O(nlogn)。参考程序:#include#include#define maxn
2016-05-24 12:46:53 435
原创 poj之旅——1065
题目描述:有一些木棍,每个有长度和重量,要求把这些木棍排成若干两个属性值均不下降的序列。问至少要分为多少个序列题解:此题用贪心应该是可以过的,毕竟网上有人发出题解打的是贪心,但是在《挑战。。》一书中放在了dp的一章,可以思考如何用dp做。 我们先将长度按递增排序,那么就简化问题,只需求其重量的序列即可。 我们假设在整个序列中的最长下降序列的长度为L,最终答案
2016-05-23 13:03:17 256
原创 poj之旅——3181
题目描述:农夫约翰有N元钱,市场上有价值1……K的商品无限个,求所有的花钱方案题解:很明显的无限背包,定义dp[i][j]表示用前i个价值的商品花费j元,则有dp[i][j] = dp[i – 1][j] + dp[i][j – i]参考程序:#include#include#define Limit 100000000000000000using n
2016-05-22 18:37:14 240
原创 poj之旅——3046
题目描述:有A只蚂蚁,来自T个家族。同一个家族的蚂蚁长得一样,但是不同家族的蚂蚁牙齿颜色不同。任取n只蚂蚁(S题解:简单的定义 dp[i][j] := 使用前i个家族可以配出来“元素个数为j”的集合的个数。那么dp[0][0] = 1,不使用任何蚂蚁配出空集的个数为1。递推关系式:dp[i][j] = ∑0family[i]dp[i – 1][j –
2016-05-20 12:59:08 213
原创 poj之旅——1742
题目描述:有n种面额的硬币,面额个数分别为A_i、C_i,求最多能搭配出几种不超过m的金额题解:很简单的我们可以得出dp[i][j] := 用前i种硬币能否凑成,但明显超时,于是改掉定义,这个算法每次只记录一个bool值,损失了不少信息。在这个问题中,不光能够求出是否能得到某个金额,同时还能把得出了此金额时A_i还剩下多少个算出来,这样直接省掉了k那重循环。dp[i][j] :=
2016-05-19 12:47:43 196
原创 登封造极之树——树链剖分
解决问题:给出一个树,有两个操作:1.修改某条树边的权值。 2.求某个节点到另一个的路径中的最大边权值。基本原理:如果不是一棵树,而是一条链,那么很清楚用线段树做。而现在就是一棵树,那么我们就可以将树分成一条一条的链。算法步骤:1.构造:我们称这些链为重路径,每两条重路径之间由一条轻边连接,对于一棵树,每一个父节点u有且仅有一条重路连向一个子节点v,这个子节点v必
2016-05-19 12:29:58 853
原创 poj之旅——3616
题目描述:奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量题解:定义dp[i]表示第i个时间段挤奶能够得到的最大值,拆开来说,就是前面 i – 1个时间段任取0到i – 1个时间段挤奶,然后加上这个时间段(i)的产奶量之和参考程序:#include
2016-05-17 13:32:01 235
原创 poj之旅——3280
题目描述:字串S长M,由N个小写字母构成。欲通过增删字母将其变为回文串,增删特定字母花费不同,求最小花费题解:定义dp[i][j]表示将原字串s的子字串s[i…j]变换成回文的最小花费则有:f[i][j]=min(f[i+1][j]+cost[s[i]-'a'],f[i][j-1]+cost[s[j]-'a']); if (s[i]==s[j])f[i][j]=mi
2016-05-17 13:26:00 248
原创 poj之旅——2385
题目描述:2棵苹果树在T分钟内随机由某一棵苹果树掉下一个苹果,奶牛站在树#1下等着吃苹果,它最多愿意移动W次,问它最多能吃到几个苹果。题解:这道题我定义dp状态方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-1])dp[i][j]标示在时间i,已经来回了j次时的最大苹果数目。 如果当前的次数刚到当前树下,dp[i][j]++;
2016-05-16 21:42:38 305
原创 poj之旅——2229
题目描述:将一个数N分解为2的幂之和共有几种分法?题解:定义dp[i]为i的分解方案数。dp[0] = 2 ^ 0 = 1,递推到 N 。若i为偶数,则dp[i] = dp[i / 2] + dp[i – 1] ,否则dp[i] = dp[i – 1] 参考程序:#include#define maxn 1000010int f[maxn];int main(){ int
2016-05-16 21:27:08 246
原创 poj之旅——3176
题目描述:金字塔形的保龄球中从顶往下撞击,每次只能撞击左下或右下两个,求所有撞到得分的最高值。题解:极其基础的dp,f[i][j]=max(f[i-1][j-1],f[i-1][j])+map[i][j]参考程序:#include#include#define maxn 510using namespace std;int f[maxn][maxn],m
2016-05-15 17:40:33 192
原创 poj之旅——3262
题目描述:约翰的奶牛每分钟吃掉D_i朵花,把它赶走需要T_i分钟(来回加倍)。问最小损失花朵数量。题解:贪心策略是先尽量赶走吃得多并且走得慢的牛,如何衡量“多”“慢”?按照单位时间的损害,较大的既是——吃得多并且走得慢的牛。参考程序:#include#include#include#define maxn 100000using namespace st
2016-05-15 17:26:04 287
原创 网络流的征程——最小费用最大流
这类模板要求在所有的最大流中找出总费用最小的流量,最后输出费用。思路:其实这类模板就是用最短路径找增广路,具体可见程序:type edge=record tt,vol,cost,next:longint; end;const INF=maxlongint shr 2;var q,a,pre,pos,dis:array[0..100000]of
2016-05-15 16:53:06 246
原创 poj之旅——1862
题目描述:从N个数任取两个数按2*sqrt(a*b)合成新数放回,求最后那个数的最小值。题解:为了让最后的数字最小,我们需要把较大的先合成,可以用优先队列很方便的完成。参考程序:#include#include#include#include#includeusing namespace std;priority_queueque;int
2016-05-15 16:48:41 175
原创 登峰造极之树——平衡树
在所有的平衡树中,为陈启峰提出的SBT最富盛名,并且最快最方便。下面就是我对此的学习过程。首先要了解二叉排序树,然后要明白了旋转在平衡过程中的重要地位。有左旋和右旋之分,下面以右旋为例,左旋对称即可:以上为原树,经过右旋后得到:于是我们可以很清楚的得到右旋代码:void RR(int &t){ int k=left[t]; left[t]=right[k];
2016-05-14 19:30:33 398
原创 poj之旅——3040
题目描述:农夫约翰要给奶牛Bessie发工资了,每周至少 C 元。约翰手头上有面值V_i的硬币B_i个,求最多能发几周?题解:贪心策略是使多发的面额最小(最优解)。分三个阶段:首先面额不小于C的硬币属于没办法节约的类型,先统统发掉。然后对硬币面额从大到小尽量凑得接近C,允许等于或不足C,但是不能超出C。接着按硬币面额从小到大凑
2016-05-13 13:16:38 195
原创 poj之旅——1017
题目描述:有 1 * 1 到 6 * 6 的产品,最少用几个 6 * 6 的箱子装它们。题解:贪心策略是先装大的,再装小的,6 * 6 和 5 * 5 以及 4 * 4 肯定独享一个箱子(不可能再放得下同规格的产品)。装了 4 * 4 和 3 * 3 的箱子还可以放 2 * 2 的产品,给几张图,可以看得更清晰:参考程序:#include#include#include#
2016-05-12 12:40:11 277
原创 poj之旅——2393
题目描述:给出n天的商品单价C_i和需求量Y_i,给出仓库的储存单价S,求最小成本。题解:用now表示这一天的最小成本,可知now=min{a[j]+S*(i-j)},由此式我们可以很方便的看出now可以边做边算,于是总成本只要求和即可。参考程序:#include#include#includeusing namespace std;int main(){ int n
2016-05-11 12:42:42 263
原创 poj之旅——3190
题目描述:给出n个区间,问能将这些区间最少能分成几组,使得每一组的每一个区间都没有交集。题解:贪心,按照开始时间小的排序,定义一个优先队列,然后每次只需要检查当前是否有奶牛的挤奶工作已经完成的机器即可,若有,则换那台机器进行工作。若没有,则加一台新的机器。参考程序:#include#include#include#include#include#include#in
2016-05-11 12:24:05 246
原创 poj之旅——1328
题目描述:在一个坐标系中,给出一系列点的坐标,要求在x轴上找出尽量少的圆心,并保证以这些圆心画半径为r的圆能覆盖全部点。题解:贪心,从最左边的点开始,尽量把圆心往右放,直到处于覆盖不了这个点的临界状态,然后在判断其后的点有多少被这个圆覆盖,最后圆的数量加一,重复。参考程序:#include#include#include#include#include#includeusi
2016-05-10 12:19:31 208
原创 poj之旅——2376
题目描述及题解:给定N个小区间以及区间起点终点,求能用它们覆盖区间[1,T]的最小组合。贪心策略是从左往右,尽量选择长度最大的区间。首先对所有奶牛排序,按照开始时间排序。然后更新起点=终点+1,搜索剩下的奶牛中能够覆盖这个起点同时终点最远的那一头,更新终点。参考程序#include#include#include#include#in
2016-05-09 14:06:49 212
原创 poj之旅——3050
题目描述:在5 * 5的方格里跳房子,起点是任意位置。将跳过的数连起来组成一个5位数(前导零可能),问一共能组成多少个数字?思路:当前的状态可以定义为当前位置、当前数字长度、当前数字这三个要素,利用状态转移dfs即可遍历所有情况。对于数字的储存使用single key set(说白了就是桶,不过方便一些)可以轻松满足要求。参考程序:#include#include#incl
2016-05-09 12:29:21 228
原创 poj之旅——3187
题目描述:将一行数按杨辉三角的规则计算为一个数,已知最后那个数和三角形的高度,求最初的那行数思路:用杨辉三角的组合公式:杨辉三角前10行: 1
2016-05-09 12:17:30 233
原创 poj之旅——2718
题目描述及题解:题意:给出最多10个数字,将它们划分为两个整数,求差异值最小的值(除非只有一位数,否则不允许出现先导0)题解:很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2,dfs搜一遍即可。参考程序:#include#include#include#include#includeusing namespace std;const int
2016-05-08 19:27:02 237
原创 poj之旅——3669
题意描述与解析:有个小文青去看流星雨,不料流星掉下来会砸毁上下左右中五个点。每个流星掉下的位置和时间都不同,求小文青能否活命,如果能活命,最短的逃跑时间是多少?思路:对流星雨排序,然后将地图的每个点的值设为该点最早被炸毁的时间。如果起点一开始就被炸毁了的话,那小文青就直接挂花,否则bfs。参考程序:#include#include#include#include
2016-05-08 18:49:54 488
原创 poj之旅——3009
题意:给出一幅图,0表示可走的路,1表示障碍,3表示终点,2表示起点(可视作0),求一个小球由2到3需要撞上障碍或边缘的次数(每撞一次,障碍则消失,重新选定方向,小球将沿次方向一直运动到撞上什么或到终点)思路:深搜,但有点麻烦。在深搜过程中三个判断: 1.若是0,则继续走 2.若是3,则替换结果 3.若是1,则消除障碍,继续走,
2016-05-07 19:00:24 204
原创 poj之旅——1979
思路:简单的深搜参考程序(作者我从此改C++了):#include#include#includeusing namespace std;const int direction[4][2]={{-1,0},{1,0},{0,-1},{0,1},};int step=0,W,H;char room[20][20];int dfs(const i
2016-05-05 21:52:19 219
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人