随笔分类 - ACM
摘要:dp,图论题意:输入n和m表示n个牛(从1到n标号),下面m个信息,A B,表示A牛能打赢B牛。现在要给所有的牛排名(按实力从高到低),问哪些牛的排名是可以确定的如果知道由l个人能打赢自己,自己能打赢w个人,且l+w+1 = n的话,那么自己的排名就是可以确定的,所有转化为要求出,每个人,能打赢多少人,能被多少人打赢建图: dp[i][j]=1表示i能打赢j,=0表示不确定他们之间的关系,然后类似floyd那样dp,若dp[i][k]=1且dp[k][j]=1,则dp[i][j]=1dp结束后扫描一次整个dp数组即可被归为中等题,这不是水题么。。。。#include <cstdio>
阅读全文
摘要:训练的题目模拟题,蛇形矩阵,保证是n*n的矩阵,并且n是奇数 , 在矩阵中填数,从最中心开始填,逆时针转圈,1,2,3…………n*n。输入n,表示矩阵的大小,输入一个数字m,找出m在矩阵的哪行哪列其实这个蛇形矩阵可以分为一圈一圈来看,要找m,可以先确定它在哪一圈每一圈都值的范围是 [ k^2+1 , (k+2)*(k+2) ] ,其中k是奇数看一圈的四个角,右上角最大: max = (k+2)*(k+2)左上角次之: max - (k+2) + 1左下角再次: max - 2*(k+2) + 2右下角 : max - 3*(k+2) + 3所以可以以这4个值作为一个范围,将这个圈分成4份,..
阅读全文
摘要:训练的题目最大流题意:题意直白,就是一个网格从(0,0)编号到(N-1,M-1),每个点可以走到和它相连的4个点,没条边都有容量,为你从(0,0)到(N-1,M-1)的最大流1.建图细心一点不要出错,注意检查2.无向图,本来建的是无向图,无端端注释掉一部分,WA了一次才想起来怎么注释掉了,改回来过了3.建图后,直接上最大流模板,这里用EK#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;#define N 10100
阅读全文
摘要:训练的题目最短路变形题意:这个题意,太长了,总结回来只有两三句话。输入n表示n个点,从0到n-1,输入m表示m条无向边,输入t,表示终点。要你求起点0到终点t的最短路,不过要先满足一个条件,就是路径的点数不超过10个(包括起点和终点在内 <= 10),如果在10个点内娶不到或者图根本不连通,那么输出no,否则输出最短路又是一个加了限制的最短路,是要先满足10个点以内再求最短路的,训练的时候就是看错了一直WA。这题和 poj 1724 ROADS 是一样的题目。可以看作每条边的花费是1点数,你从0出发,手上有9点数,在点数够用的情况下走到终点t的最短路因此仿照poj这题的代码,写了一个dp
阅读全文
摘要:差束约分有人将这题归为最短路的中等题,所以做一下,但是发现其实是裸的差束约分题意:n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果m行信息,所以得到m个不等式 : XB - XA <= C , 所有不等式加起来就是一个差束约分系统对应最短路模型,一开始是 d[v] >= d[u]+w (有向边u--->v) , 在进行完最短路后则变为 d[v] <= d[u] + w ,转化为 d[v] - d[u] <= w这个和上面的 XB - XA <= C 是相同的模式 , 因此建图的时候有向边
阅读全文
摘要:最短路变形题意:你有K个点数,有N个点,M条边,边为有向边,包含4个信息,两个端点+边长+走这条边需要付出的点数。你的任务是,从1号点出发走到n号点,在点数够用的情况下,走出一条最短路,单case显然是一个最短路的变形,而且是一种常见的模型。最短路本身是一个求解最优解的问题,在这里加多了一个限制条件,就是点数,所以变为“在一定的限制条件下求解一个最优化问题”的模型,这样的模型,可以由一个大致的套路,就是,在满足限制条件后,再进行更新下面将讲3个方法,前两个其实都是BFS,第3个事DFS,是一个记忆化搜索。我们先说BFS1.优先队列+dij(最快) 判断一个元素能否入队,不再是看它的最短路估计值
阅读全文
摘要:地址:http://codeforces.com/contest/200/problem/C模拟题题意:模拟足球小组赛的排名变化。规定只有4个球队,我方球队为BERLAND,一定会有的,然后另外3个球队的名字不一定。4个球队,两两球队间打且仅打一场比赛(所以可以知道一共是打了6场)。输入中给出5行,即5场比赛的信息,还剩下一场的信息没有给出。保证最后一场一定是BERLAND打某个队的,对手是谁要找出来(这个不难),而且也规定这场比赛一定是BERLAND胜利。你的任务是,要令BERLAND在这场比赛后,排在第1名或第2名,满足这个条件下,这场比赛的净胜球数最少,如果净胜球数一样,要令对方的进球数
阅读全文
摘要:隐式图搜索训练的题目,题意:输入n表示串(串为基因,只会出现ACGT)的长度,下面两行长度为n的串,第一个为起始串,第二个为目标串。对串能做两种操作。1.将头元素移动到尾部。2.最前面两个元素交换位置。从起始串到目标串的最少操作次数是多少,输出这题一看,觉得是DP,后来发了两三分钟的样子想到了是搜索。对于当前的串,它是一个状态,通过两个操作,能产生两个新的状态,所以这个过程就可以建图,搜索,找出两点间的最短路。注意这里不是树,因为很容易想到,这个图是可以有环的。另外,可以大致计算到状态数是很多的(串长最大为12),所以不能显式建图,当然也没必要显式建图,因为很多点(状态)是不会去到的很快打出代
阅读全文
摘要:概率题题意:输入case数,每组case两个数字,表示A的点数和B的点数,他们玩游戏,每个人赢的概率都是0.5。输的人要将自己的一部分点数给对方,给的点数是min(na,nb)。例如na=3,nb=2如果A赢了,B要给2点给A,即全部给完。如果B赢了,A要给2点给B,A变为1,B变为4。一个人的点数为0,那么游戏结束了。题目要你输出两个数学期望,第一个是,这个游戏要结束,要玩多少局的数学期望,另一个是A赢的概率这题一开始看觉得是期望DP,后来想想也可以不写DP,能把状态表达出来即可。设一个状态(n,m,c)表示A现在的点数是n,B的点数是m,已经玩了c局。那么游戏结束的状态就是(n,0,c)或
阅读全文
摘要:继续复习暴力给出n个点的坐标,选出最多的点,在一条直线上直接暴力,不过时间比较糟糕。一个二重循环,枚举i,j两个点,这两点确定一条直线,然后枚举剩下的点看是否在这条直线上,所以一个三重循环,时间复杂度O(n^3)注意枚举不要做重复的工作,否则会超时另外这题是有O(n^2logn)的算法的#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;#define N 710#define LEN 110int n;struct
阅读全文
摘要:继续复习暴力题意:输入有点恶心,首先是case数,然后一个空行,然后再输入信息,然后又以一个空行结束该组数据,如果是最后一组数据了,不以空行结束,而是直接以EOF结束。输出,case之间有一个空行,最后一个case后面不要加空行每组case的信息,就是N行的串,串中只有01,串的个数一定是偶数。原本有很多个一样的长串,每个长串都分成了两个短串但是分割的位置不一定相同即两个短串不一定是平分的(就是输入中的那些串)。你要把这偶数个短串拼回那个长串(即2N个短串拼回N个相同的长串),如果有多种可能,任意一种即可,然后输出这个长串题目保证一定有有解的数据不大,144,直接暴力。首先按短串的长度升序排序
阅读全文
摘要:继续复习基础算法题意,给n个数字,将它们重新排序得到一个最大的数字,好像给出123 456 789 拼为 789456123 最大这题可以算是一个排序题,不过排序的规则有讲究如果想用字典序排序,显然错了,好像999123 999 , 按字典序排序999123在前面,得到的数字为999123999 , 显然没有不够999999123 大有两种不同的思想解这题1.处理前缀的问题,上面那个例子,999是999123的前缀,这种比较不能简单以字典序比较,而是应该用一种“环”的思想去比较,即999比完了,A串到了1,B串应该轮回来变为9,。也就是A串和B串都已这种环的方式去计较,知道第一个不相同的字符出
阅读全文
摘要:哈希题意简短:单case,输入一列单词即一个字典,已经按字典序排好输入,上限为120000,然后要你找一些单词,这种单词可以分为两部分,两部分都是字典里面的单词,按字典序输出这种单词很裸的哈希,对于每个单词,将其分成两部分,一共有len中分法,然后去查找是否都在字典中,如果都在字典中就输出(因为输入已经按字典序排好,扫描时直接扫下来就可以了,找到合适的就输出)问题的关键就转变为,给你一个单词,怎么判断这个单词是不是在字典中,用哈希就可以快速判断到。输入时随便将每个单词都用哈希函数映射掉,每得到要查询的单词也直接映射过去查找处理冲突的方法是链表(静态链表数组模拟)用了BKDHash函数在处理字符
阅读全文
摘要:复习一下基础DP,记忆化搜索题意:给一个名字,和n*m矩阵,下面是矩阵信息,每次在一个格子,可以向上下左右移动,但是要求那个数字比当前所在格子数字小。可以从任意点出发,问最长的距离是多少dp[i][j]表示从(i,j)出发能走的最长路dp[i][j] = max{ dp[x][y] } + 1 , 其中(x,y)是(i,j)附近的四个格子之一并且a[x][y] < a[i][j]#include <cstdio>#include <cstring>#define N 110#define MAX 110#define max(a,b) ((a)>(b)?(a
阅读全文
摘要:poj 2168 相同的题目区间DP题意:输入n,表示有n个海龟在一条直线上,乌龟可以站在相同的位置(即坐标可以相同),下面n行,每行两个数字,表示第i个乌龟给出的信息,第一个数字表示它前面有多少只乌龟,第二个数字表示它后面有多少个乌龟。并不是每个乌龟的信息都是正确,有些乌龟的信息是假的,或者和别的乌龟信息冲突,你的任务是选出尽量多的乌龟,使他们的信息不冲突,然后输出有多少个乌龟说谎,和那些乌龟的编号,可能有多种情况,只要保证说谎的乌龟数最少,输出哪种情况都可以分析:乌龟可以站在一样的位置,我们给乌龟排名,可以把它们放在不同的位置 例如 1 2 3 3 3 4 4 5 , 虽然有些排名相同,但
阅读全文
摘要:数据结构--二叉查找树遍历题意:n,表示二叉查找树的节点个数,每个节点有个数值,并且数值各异不会出现重复的,查找树左子树的节点数值小于根,右子树的节点数值大于根。 一般的后序遍历二叉树时 左孩子,右孩子,根 ; 现在定义一种新的后序遍历 右孩子,左孩子,根 输入n,下面一个序列,是普通后序遍历二叉树的序列 , 要你根据这个序列,输出新定义的那种后序遍历序列 讲到这里,看图,看sample可以理解题意了要是一般的二叉树只知道后序遍历序列是不能建树的,但是这里是二叉查找树却可以对于一个后序遍历序列,它可以分解为 (左子树部分)(右子树部分)(根),由于是查找树,可知(左子树)<(...
阅读全文
摘要:找规律约瑟夫环问题变形。在这个约瑟夫环问题中,固定每次间隔两人,10个人,杀人顺序为2,4,6,8,10,3,7,1,9,最后剩下5定义一种运算J^m(n) 表示 m次嵌套 J( J( J(n) )好像J^2(10) = J(J(10)) = J(5) = 3而m和n的最大值是 10^9这个问题 主要是能快速算出 J(n),不难想到如果能算出J(n),可以暴力地一步一步迭代下去做m次,容容易发现不用做m次,因为J(1) = 1,当n降到1的时候,m再大都没意义了可以发现这个问题是指数递减的,m<=10^9 是个纸老虎同样地可以打表看看J(n)的值,一看就能看到规律对于一个范围的n , [
阅读全文
摘要:数论+打表A的所有因子和位B,B的所有的因子和为A,则称{A,B}是一对ooxx number输入数字n,求出[1,n]里面有多少对ooxx number,其中(A,B),(B,A)这样算作一对n最大为5百万(50000000)hits 220= (1+2+4+71+142) <--- 284,284= (1+2+4+5+10+11+20+22+44+55+110) <--- 220。220 and 280 is a pair of ooxx numberssample input3001300sample output12定义sum[i]=i的因子和,用筛法来构建i枚举因子i..
阅读全文
摘要:线段树题意:有一个长H宽W的板,上面贴纸条,纸条都是长1宽w的,贴纸条的原则是,不能覆盖或重叠别人的纸条,尽量往上贴,进而尽量往左贴第一行3个数字,H,W,N,N表示有N个纸条,下面n行每行一个数字,表示每个纸条的宽,每个输入对应一个输出,就是这个纸条放在哪一行,如果没地方放它就输出-1数据很大,不过是纸老虎,因为H=min(H,N),这个很容易理解,行数多了也用不上。/*h=min(h,Q);线段树区间长度为h,每个叶子a[i]表示第i行剩下的长度,一开始都是w对于每个询问,我们其实是将长度为l的长条放入一行呢,即对应放到a数组的一位里,要满足a[i]>=l,并且最靠左所以问题转化为在
阅读全文
摘要:暴力训练的题目,给出一个数字(最长1000位即10^1000),给出m表示交换次数(每次可以交换任意两位的数字),问交换后得到的最小数字。注意,数字不能有前导0,另外有m次交换机会,但不必全部用完,只要交换到最小数字了就可以退出为了得到最小数字,就是从高位开始,不断找最小的数字放到高位(但第一位要特殊处理不能为0)。如果现在使第i位最小,从第i到最后一位扫描找到最小值然后交换然后交换次数减1,如果刚好第i位就是最小值,则不交换,直接跳过,所以交换次数不能减1。如果m>len,即大于数字的位数,那么显然后面的交换机会都是多余的,最多交换len次就可以退出了所以结束枚举的条件是,以为枚举了全
阅读全文