08 2018 档案
摘要:原题链接:UVa10168解析:当n#include#include#includeusing namespace std;const int maxn = 10000000;int vis[maxn];int primes[maxn];int main(){ int...
阅读全文
摘要:原题链接:UVa10929解析:本题可以用递推或者奇偶差位法:从右至左,分别将奇数位的数字和偶数位的数字加起来,再求他们的差。如果这个差是11的倍数(包括0),则A一定能被11整除。代码示例:#include#includeusing namespace std;in...
阅读全文
摘要:原题链接:POJ1597解析:主要难在理解题意,题目问是否分布均匀,就是说随机数是否从0~mod-1都有,其中seed0是可以是任意值,但是我们可以证明seed并不影响结果,由基本模运算可以得到:seed(i) = (seed(i-1) + step)%mod = (...
阅读全文
摘要:原题链接:POJ2234解析:推理证明了半个多小时,证明出来了一个做法,提交才发觉题意理解错了。他并不是顺序取每一堆,而是随便取一堆,于是虽然我推出来了一种做法,但是却不是本题解法。本题解法用到二进制,以我目前层次是肯定想不到这种解法的。我们可以定义一种状态:平衡态,...
阅读全文
摘要:原题链接:POJ1852解析:本题需要自己建立模型,思考算法。本题要求最后一只蚂蚁掉落的最小时间和最大时间,如果两只蚂蚁相遇,他们会掉头,但是我们可以将它们看作没有相遇。因为a遇到b后掉头,把a看作b,b看作a,就相当于b继续走,a也继续走,只是两只蚂蚁交换了而已,而...
阅读全文
摘要:原题链接:POJ2573解析:本题没有已知算法模板,需要自己建模。如果想在最短时间内过河,势必要考虑速度最慢的人如何过河,那就需要让速度最快的帮助速度最慢的渡河,这样才可以节约时间。这样问题就可以转化成如何让最慢的人过河才节约时间。设最快的人为a,次快为b,最慢为d,...
阅读全文
摘要:原题链接:POJ3321解析:这题我按照郭炜老师的讲义来练习树状数组的模板,但是也遇到了一些问题:如果对一些图或树来用树状数组解题,就需要给他每个节点一个从1到nCount的编号,因为树状数组只能从1~n求和 刚开始我用vector G[maxn]来存图,但是超时了,...
阅读全文
摘要:原题链接:PAT1139解析:这题真的很有陈越老师的风范。。。五个数据点没有一个是随机生成数据的,每个测试点都对应一个细节。由于是用'-'来表示女生,而int型读入数据如果是-0000,则表示为0,这样就丢失了性别,故需要用字符串读入 由于输出是要求四位数id,若id...
阅读全文
摘要:原题链接:POJ3259解析:找了四五小时bug,打错俩个字母,想吃口屎冷静一下。代码示例:#include#include#include#include#includeusing namespace std;const int INF = 2e9;const in...
阅读全文
摘要:原题链接:HDOJ2586解析:用树上倍增法来求LCA代码实例:#include#include#include#include#includeusing namespace std;const int maxn = 40010;int f[maxn][20],d[m...
阅读全文
摘要:1.树的直径1.1 树形DP求树的直径1.1.2 思路:设d[x]为从结点x出发走以x为根的子树,能够达到最远结点的距离。设x的子节点为y1,y2,y3...yt,edge(x,yi)表示边的权重,那就有:d[x] = max{ d[yi] + edge(x,yi) ...
阅读全文
摘要:1.Bellmen-Ford判定负环思路:若经过n轮迭代,算法仍未结束(仍有能产生更新的边),则图中存在负环 若n - 1轮迭代之内,算法结束(所有边满足三角不等式),则图中无负环2.SPFA判定负环思路:设cnt[x]表示从1到x的最短路径包含的边数,cnt[1] ...
阅读全文
摘要:原题链接:POJ2528解析:这题考察的是线段树子区间更新的维护中的计算可见线段。用离散化,排序去重,但是这题广告是一块瓷砖一块瓷砖贴的,也就是说有可能离散化之后,明明俩个相邻点之前有空白,但是由于离散化分配序号是紧挨着的,就造成了俩块有广告瓷砖紧挨。举个例子,比如四...
阅读全文
摘要:原题链接:POJ3468解析:本题也是线段树的一种用法,算得上裸题,我用这题来加深对线段树的理解,以及熟悉线段树的模板。郭炜老师的代码是演示指针写法,但我更喜欢用数组来表示,所以改成了我喜欢的模板。PS:刚刚刚刚刚才知道,这种方法是延迟标记,也就是说当对一端区间的叶子...
阅读全文
摘要:原题链接:POJ3264解析:我拿本题来熟悉线段树模板的,这个应该算是裸题了。代码示例:#include#includeusing namespace std;const int INF = 2e9;int minV = INF;int maxV = -INF;str...
阅读全文
摘要:代码出自:《算法竞赛入门经典——训练指南》P328#include#include#include#includeusing namespace std;const int maxn = 10005;const int INF = 2147483647;struct ...
阅读全文
摘要:原题链接:POJ1287解析:这题我用来练习Prim算法的,算是当作一个模板来看。以下代码有几点要说明的:我使用了优先队列,并没有使用dist[u]数组来保存当前子树到 u 的最短距离,这样省去了找最短路的时间 由于队列中存放的最短距离,可能该点已经存在子树中了,所以...
阅读全文
摘要:原题链接:ZOJ2107解析:此题为最近对模板题,用分治法求最短对问题,可以在O(nlongn)时间内求出。易错点:+ - 等符号与位移运算符 > 优先级没搞清楚,自以为位移运算符比 + - 高 谁减去谁要写正确,因为都是排好序的,所以必然在后面的大于前面的代码实例:...
阅读全文
摘要:题目链接:POJ3714解析:本题是分治法求最近对问题的应用。唯一变化的是标识flag,如果两个点是同一种类型,那么他们不能链接,就设为inf(无穷大)。其中sqrt()算法耗时很多,尽量可以先用不开根的结果运算,最后再开根,本题我没有这样做。代码示例:#includ...
阅读全文
摘要:1.求最长上升子序列:1.1 思路:用一个数组d记录到i位置的最长上升子序列d(i),那么第j个位置上的值就可以用前j-1个值来更新,时间复杂度O(N^2)。1.2 代码实例:int d[100005];int LIS(int A[],int n){ memset(d...
阅读全文
摘要:原题链接:PAT1146解析:这题我第一次做只过了4个点,最后一个超时了。第一次方法是先用删边法求出所有拓扑排序,然后用map,bool>来检查给出的拓扑排序是否正确。然后我想用dfs计算拓扑排序的方法改进,但是书上显然没有对这种方法详细教程,因此试了四五次都过不了。...
阅读全文
摘要:原题链接:PAT1147解析:这题应该就是简单的堆模拟,如果看得懂英文题意的话不算难。我的做法利用了二叉树的一个性质,即从上往下从左往右依次为节点编号为0,1,2....,那么第i个节点的左子节点编号为2*i+1,右子节点2*i+2。我第一次没通过的原因:刚开始我判断...
阅读全文
摘要:个人笔记,仅供复习 ——《数据结构编程实验》P351计算拓扑排序的方法有两种:删边法和采用DFS计算拓扑排序。1.删边法:由于每一条拓扑子路径的首节点的入度为0,因此可以采取如下办法:步骤1:从图中选择一个入度为0的点且输出之 步骤2:从图中删除该节点及其所有出边(即...
阅读全文
摘要:原题链接:UVa10305 P168解析:在数据结构书上介绍此类题目解法,但还是紫书这个解法妙。检查是否存在有向环,若不存在,进行排序。 由于递归,先压入数组的最大值,故topo数组要从后往前存。代码实例:// 题意:输入n和m,以及m个二元组(i,j),求1~n的一...
阅读全文
摘要:解析:我拿这题来练习拓扑排序相关知识。《数据结构编程实验》中给的是Java解法,虽然我正准备学Java,但是目前却还是只会用c++解题。这次解题我很依赖STL,用到了map、vector、string等类,并以此为基础,虽然我本意是想让代码更简洁,可读性更强,但是好像...
阅读全文
摘要:原题链接:UVa12034解析:排列组合公式:C(n,k) = C(n-1,k-1) + C(n-1,k)。代码实例:#includeconst int maxn = 1000;const int MOD = 10056;int C[maxn+1][maxn+1], ...
阅读全文
摘要:原题链接:UVa580解析:设f[n]为答案,g[n]为前n个没有3个盒子放在一起的情况。代码实例:#includeusing namespace std;int f[31], g[31];int main() { f[0] = f[1] = f[2] = 0; ...
阅读全文
摘要:原题链接:UVa1637解析:一开始用的是深搜,但是超时了,明显我没计算好时间。然后尝试用记忆化处理,但是状态我却没法表示,事实上用map,double> d 可以把数组当作一个状态来表示是否已经搜索过。那么这个d的第二个位置表示的就是当前状态成功率,如果不能成功呢,...
阅读全文
摘要:原题链接:UVa11181解析:求每个人实际买了东西的概率,就是求第i个人买了东西的情况下有r个人买了东西。设有r个人买东西为事件E,第i个人买东西为事件Ei。那么要求的就是p( Ei E ) = p( E * Ei) / p( E )。代码实例:#include#...
阅读全文
摘要:原题链接:UVa10491解析:一定要读懂题意,尤其是英文。刚开始以为主持人每打开一个门,就换一次,然后才发现是一次性打开c个门再问你换不换。代码实例:#include#includeusing namespace std;int main(){ int a,b,c;...
阅读全文
摘要:原题链接:UVa1636解析:直接扣一枪没弹的概率是所有子串总00的个数与00+01个数的比值,也就是00与0个数的比值。转一圈再扣,概率是0的个数比上0+1的个数,即0与字符串长度比值。代码实例:#include#includeint main() { char ...
阅读全文
摘要:原题链接:UVa10820解析:由题意可得,当表最简时,x与y不能有公因数,即x与y互素。当xy时同理,故最终答案为ans = f + f + 1。最后加上的1是f(1,1)。代码实例:#include#includeusing namespace std;const...
阅读全文
摘要:解析:若想m是a的倍数,那么将m和a按照唯一分解定理分解为素数相乘,a对应素数的指数一定要大于等于m对应素数的指数。其中e是对应p的素数的指数,根据递推式,每次与(n - k + 1)/ k 相乘,改变了对应的指数,故用e表示不同系数的对应位置上素数的指数。代码实例:...
阅读全文
摘要:原题链接:UVa10791解析:给出n,可以由唯一分解定理把n分解为若干素数相乘的形式(n = a1^p1*a2^p2*...)。由于任意一个数都可以分解成上述形式,所以最小公倍数为n的一些数分解出来的每个素数的指数一定不大于n对应素数的指数。每个a^p单独作为一个整...
阅读全文
摘要:原题链接:UVa10375解析:其中primes是前1000个素数,e数组存放每个素数对应的指数。代码实例:#include#include#include#includeusing namespace std;int primes[1005];int e[1005]...
阅读全文
摘要:原题链接:UVa10934解析:设还剩i个气球,j次机会时能够测得的最大高度为d[i][j](换句话说,就是d[i][j]层内,可以用i个气球j次机会测出气球硬度为j),可以知道:如果此层气球炸了,那么就意味着d[i][j] - 1 层必须用i-1个气球,测试j-1次...
阅读全文

浙公网安备 33010602011771号