随笔分类 - Uva
摘要:数学题题意(就是因为读错题意而wa了一次):给一个数字n,范围在[1,2^23-1],这个n是一系列数字的最小公倍数,这一系列数字的个数至少为2例如12,是1和12的最小公倍数,是3和4的最小公倍数,是1,2,3,4,6,12的最小公倍数,是12和12的最小公倍数………………那么找出一个序列,使他们的和最小,上面的例子中,他们的和分别为13,7,28,24……显然最小和为7这个题目一开始没有头绪,写了一个暴搜程序来找答案,然后一目了然首先假设我们知道了一系列数字a1,a2,a3……an,他们的LCM是n,那么什么时候他们是最优解呢,当他们两两互质的时候为了方便我们以两个数来说明问题。a和b的L
阅读全文
摘要:DP构建(仿照Floyd)这题说难挺难的,现在想想好像也不太难,是因为想复杂了。其实这题的要求不算多,它仅仅是要求最后转换回到出发时的那种硬币并且获利大于0.01,而转换次数不能超过n次,转换次数越少越好,然后输出最短的路径。注意:题目并没有说要你获利最大,只是是获利>=0.01即可,另外题目对路径并没有什么特殊要求,仅仅是要求不能超过n,在路径长度相同的情况任意一条都可以的。所以我们就抓住一点:转换次数!!!!!!也就是说每转换一次,我们就去找所有的货币,看他们回到自己的时候那些货币的获利已经大于0.01了,如果有货币的获利已经大于0.01了,那么我们的算法就结束了,就输出这种货币的转
阅读全文
摘要:DP(类似于矩阵链乘法)我们以sample来说明问题长度100,切的地方为25,50,75.那么无论怎么切最后都是剩下四段 [0,25] , [25,50] , [50,75] , [75,100]把它们连续的两两合并的话就能得到上一层的状态,好像[0,25]和[25,50]合并,就得到[0,50],也就是说从[0,50]变到[0,25] , [25,50],花费是多少呢,就是50所以说到这里,也差不多了,状态转移方程为 dp[i][j]=min{ dp[i][k]+dp[k][j]+(y-x)} (k是i和j之间的一个数)这样子的话,我们的目标状态就是dp[0][len],即原来的整一条的费
阅读全文
摘要:数学题(概率基本知识+DP记忆化搜索实现)题意:概率题:丢n个骰子,和大于等于x的概率是多少,用反面来求,1-小于x的概率首先丢n个骰子,可以看做是依次丢的(独立重复试验),每次丢的点数记录下来,比如3个筛子123和132是不同的,所以就是一个排列(而不是组合),那么总的可能为6^n,要用long long 保存。然后再找出有多少个排序和和是小于x的。这个找特殊排列的过程用DP来构建才不能超时(我用的是记忆化搜索,当然递推也是可以的,仿照记忆化搜索来写的,个人更倾向于记忆化搜索,容易理解,而且应该很多没用的状态不会去到,但是递推会推出所有状态)记忆化搜索,开一个二维数组dp[i][j],表示现
阅读全文
摘要:DP(DAG上的DP)题意:给你一个目标金额n,有5种硬币50,25,10,5,1,每种硬币无限个,用这些硬币构成这个目标金额n,有多少种不同的构建方法看做一个有向图处理:好像11能减去5得到6,那么有向边11--->6,同样11减10可以得到1,那么有有向边11--->1其实其他就是问n到0有多少条不同的路径。下面是注意处理的问题好像6,1+5和5+1是一样的只能算为一种情况。没了防止这种情况我们采用减序构建,好像5511是唯一一种它是减序的,5151这些就不是了这样做就不会重复,但是有可能漏掉,所以要记录前驱用的是哪一种硬币这样做不仅能防止重复还能防止遗漏,具体看代码另外一点,
阅读全文
摘要:数学题(概率基础题+暴力)题意:给你n个人,给出每个人会购物的概率,然后给你r,即r个人会购物其余人都不购物。然后需要你输出n行,第i行就是这个r个人中有一个是第i个的概率是多少其原型就是,有5个人,选3个人出来,甲在其中的概率。不过5变成了n,3变成了r。这个样子的话就是一个条件概率即pb为从n个人中选r个的概率。pa就是甲在其中的概率 pa/pb就是答案这个样的话,只能暴力了(我只能想到暴力),即在n个人中找出r个人(就是一个组合,不是排列),把这r个人的概率相乘其余人的反面概率相乘。然后所有的这些我概率相加就是pb。然后同样的,选定甲,再选r-1个人(组合),甲和这r-1个人的概率相乘.
阅读全文
摘要:就是一个裸的LCS,不过注意用gets读入#include <cstdio>#include <cstring>#define N 1010int main(){ int n,m,dp[N][N]; char s1[N],s2[N]; while(gets(s1+1) && gets(s2+1)) { memset(dp,0,sizeof(dp)); n=strlen(s1+1); m=strlen(s2+1); for(int i=1; i<=n; i++) for(int j=1; j<=...
阅读全文
摘要:DP经典题目题意还是比较好懂就是矩形嵌套,不过这个矩阵是m维的,而且嵌套要严格大于。输入n和m,表示有n个维数为m的超立方体。下面n行每行m个数字,是每个超立方体的信息,即每个维的大小超立方体的信息可以调整,判断一个超立方体a能不能套住超立方体b是看调整之后能不能好像(2,6)和(7,3),可以调整为(2,6),(3,7),那么显然(3,7)是能套住(2,6)的另外能不能套住,还需要每一维都严格大于,好像(2,6),(2,7),由于2相等不能套住其实就是DAG模型,若i能套住j,则g[i][j]=1,然后这个有向图显然是无环的,(要套住必须严格大于,不可能存在互相套住的情况)。相当于求这个DA
阅读全文
摘要:数学题题意:多项式(x1+x2+...+xk)n.输入n和k(0<k,n<13),分别表示多项式次数和变元数。第二行为k个非负整数n1,n2,...nk,满足n1+n2+...nk=n.输出多项式(x1+x2+...+xk)n展开后的(x1)^n1*(x2)^n2...(xn)^nk这一项的系数。思路:如果单单是(a+b)^n,那我们可以轻易地用二项式定理来解决系数的问题,但是现在变量有k个,要怎么办呢?我们可以用一种递归的思想来看这道题,化繁为简,将一个没见过的问题转化为见过的(x1+x2+x3……+xk-1+xk)^n=(Xk-1+xk)^n , 即我们把前面k-1项全部加起来
阅读全文
摘要:最大流 OR 二分图匹配题意:输入n,有n个插座,下面n行是每个插座的类型(最后24个字母来表示一个插座,没有空格放心用scanf,但是有可能插座会相同,但是这个没有什么影响) 输入m,有m个电器,下面m行每行两个单词分别是电器的名字和插头类型(同样24个字母单词内没空格,两个单词空格隔开) 输入k,有k个转换器,下面k行每行两个单词,分别表示转换器的入口类型和插头类型每种转换器的个数是无限的,转换器本身可以与转换器相连要你求,让最多的电器能够插在插座上(可以用转换器辅助也可以直接插上去),输入不能插上去的电器的数量思路一:转化为最大流,重点还是如何建图,我是用邻接表建图的这样效率...
阅读全文
摘要:数学题,给定一个十进制数转化为-2进制。这个问题可以扩展为转化为任意的负进制,先说-2进制算法:n mod -2 余数可能为-1,0,1,但是不能出现-1,只能有0,1所以将-1变为1,并且商要加1。然后依此迭代直到商为0为止。为什么余数要变为1而且能变为1呢,变了之后要怎么做呢?我找了很多博客都没有说原理,只是简单一句话,可能大家都觉得很简单吧,但是我还是想了一段时间才想出来的,所以就写一下原理我们来看一个10进制转2进制,例子1024第0次迭代,1024/2=512,1024%2=0 , 试一下把512++变为513,那么逆回去就是1026,多了2,其实就是2^1第1次迭代,512/2=2
阅读全文
摘要:网络流最大流(经典的逃脱问题但是不会做啊)这题不会做,问了别人的思路,知道是最大流,但是还是不会编码,后来找了解题报告,看了建图部分明白了,然后就是最大流EK算法模板即可算法思路:对于给定的网格,行为S列为A,我们按行优先给所有点标号,从1到S*A。然后对每个点拆点,拆点后一个点变为两个点(那么总点数为2*S*A),在这里我把拆点后的两个点叫做“前点”和“后点”,对于坐标为(i,j)的点,拆点后“前点”的编号为u=(i-1)*A+j , “后点”的编号好v=u+S*A;我们还要额外设置一个源点s,编号为0,一个汇点,编号为2*S*A+1。从源点s建有向边指向所有的银行,从所有网格边沿的点建有向
阅读全文
摘要:最小生成树入门题题意:有n个点给出坐标,点和点之间可以用无线电或者卫星通信,每个点都有无线电收发器可进行无线电通信,但是只有m个点有卫星通信功能。卫星通信的距离可以无限大,但无线电通信的距离不能超过D,超过D的部分将使通信费用增加。要使通信费用最少。其实就是求一次最小生成树,m个点有卫星通信,那么就会有m-1条边的通信距离无限大,其实就是这m-1条边不用计算费用。而剩下的边中,找出最大边作为D值,这样剩下的所有的边都不会大于D,那么不会增加通信费用。在构建MST过程中保存下所有的边权值,然后按升序排序,除掉最后的m-1条边(也就是最大的m-1条边,这些边用卫星通信),最大的那条就是D#incl
阅读全文
摘要:dp入门题(LCS最长公共子序列)先给出正确的序列,再给出多个学生写的序列,要求在正确和学生序列中找到LCS。但是要先转换即做一下映射原本的序列是以事件为标准给出的,即以序列中的a[i]表示事件i发生的时间为a[i]。要转化为以时间为标准的,转化后a[i]表示时间i发生的事件为a[i]然后以转化后的序列来求LCS/*先映射再用LIS模板求解*/#include <cstdio>#include <cstring>#define N 25int t[N]; //映射数组int a[N]; int n;int max(int a ,int b){ return a>b
阅读全文
摘要:怎么个图论法??这题一读完题一直没有思路,不知道和图论有什么关系,倒是一开始就想到了暴力,但是见数据的规模,怕暴力会超时所以就没写一直歇了两天,没思路去找解题保报告,看了几下,都是暴力求解(和自己当初想的一样都是求lcm作为周期来计数),所以就写了一个暴力,一次成型没有debug过了sample直接丢上uva去,AC了,不过时间也比较糟糕1.100s左右。#include <cstdio>#include <cstring>#define N 1010#define M 15bool killed[N];int c[N];int a[N][M];int n;int ki
阅读全文
摘要:DP,无耻地搜了解题报告……DP又卡住了,看了题目就觉得是DP,自己写了一个怎么过不过,另外解决不了环的问题,最后还是看了解题报告依然是仿照Floyd来DP。i到j经过k,那么i到j的路径数目等于i到k的路径数目乘以k到j的路径数目DP结束后扫描一遍所有的点,若d[k][k]不为0,说明从k出发能回到k(而题目说了输入不会存在自己到自己的环),那么从k点出发一定存在至少一条回路,d[k][k]=-1那么i到j,如果经过了点k,就有无数条路径(先从i到k,然后走回路回到k,再从k到j),把d[i][j]=-1#include <cstdio>#include <cstring&
阅读全文
摘要:最短路(隐式图搜索)题目是过了,不过时间好慢,用了2.200s。大概是没有用位运算的原因,我是直接模拟的。而解决最短路的问题是用spfa来做(感觉这种思路更加形象和容易理解,并且更符合隐式图搜索的感觉)来说说题意,这个题意都是很长很烦的。首先给出n和m,表示有n个bug和m个补丁。一开始存在n个bug,用1表示一个bug存在0表示不存在,所以一开始就是n个1,我们的目的是要消除所有的bug,所以目标状态就是n个0。对于每个补丁,会给出使用这个补丁的时间,另外会给出两个长度为n的字符串,第一个字符串表示这个补丁适用于什么情况下的bug,第二个字符串表示使用完这个补丁后原来的bug会变成怎么样。先
阅读全文
摘要:最小费用最大流题意:有n个地点,m部船(m>=n),给出每部船到每个地点的时间。然后要派船到地点。每个船只能用一次即只能去只能去一个地方,每个地方只需要一部船。算出最小平均时间。要算平均时间其实就是算总时间最小,然后除以n即可。那怎么求总时间最小呢?其实一看,就是匹配类型的问题,但是就我目前学的匹配的算法,没有可以解这道题的,然后是出于白书的图论专题,就考虑是不是可以转化为其他类型的问题来解呢?想起二分图最大匹配问题可以转化为最大流来解,所以很快就想到了用最小费用最大流来解船从1到m标号,地点从m+1到m+n标号。建立有向图,都是从u船指向v地点,单位费用就是u船到v地点的时间,容量就是
阅读全文
摘要:并查集经典题目,详细写一下吧题意:虽然比较长,但是题意还是比较好懂的。如果a和b是朋友,b和c是朋友,那么a和c是朋友。如果a和b是敌人,c和b是敌人,那么a和c要成为朋友操作1和2是假设(或者说试图建立某种关系),如果能成立不用输出,并且保持这种关系,如果这种假设(关系)与之前已经存在的关系是冲突的,那么输出-1,并且要保持原来的关系,放弃当前这个失败的。操作3和4是判断,即根据当前已知的关系,判断某两个人之间的关系是否成立,成立输出1,不成立或者无法确定就输出01 a b 即试图让a和b成为朋友唯一不成立是:a在b的敌对集合中(那么同时b一定在a的敌对集合中)a和b有共同敌人,成立a和b至
阅读全文
摘要:题意:有n个铁环用长度均为1的绳子连起来(不会有重边)。试图拿起两个铁环并在水平方向拉直,那么会有一些边会被拉直(可想而知有些绳子不会被拉直而是弯曲的),那么取哪两个铁环并拉直,能使被拉直的直线最多呢?输出最多的边数这题其实是最短路,而且通过这题可以帮助我们更形象地理解最短路的实质尤其理解松弛操作当两个点a,b被拉直,那么其实那些被拉直的边就是最短路径(从a出发到b,或者反过来也行,因为是无向图),也就是说,要找到所有的最短路径并统计有多少条不同的边(因为不同的最短路径可能共用相同的边),那么就是这两点的数目,我们只要枚举任意两个点被拉直时不同边的数目,并找到最大的那个就可以了。所以要先知道任
阅读全文