随笔分类 - USACO(杂)
摘要:描述在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣。如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素。元素不一定要全部出现(如BBC就没有出现)。举个例子,序列 ABABACABAAB 可以分解为下面集合中的元素:{A, AB, BA, CA, BBC}序列 S 的前面 K 个字符称作 S 中长度为 K 的前缀。设计一个程序,输入一个元素集合以及一个大写字母序列 S ,设S'是序列S的最长前缀,
阅读全文
摘要:题意:用N个点组成一棵深度为K的二叉树,求一共有几种方法?分析:哎,感觉自己好水呀,借鉴了USACO上面的题解才过的,自己想了好久都没什么思路设dp[i,j]表示用i个点组成深度最多为j的二叉树的方法数,(注意,这里i必定是奇数),则:dp[i,j]=∑(dp[k,j-1]×dp[i-1-k,j-1])(k∈{1..i-2})边界条件:dp[1,i]=1我们要求的是深度恰好为K的方法数S,易知S=dp[n,k]-dp[n,k-1]。但需要注意的是,如果每次都取模,最后可能会有dp[n,k]<dp[n,k-1],所以可以用S=(dp[n,k]-dp[n,k-1]+v) mod v
阅读全文
摘要:题意:考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号)。计算该表达式的结果并判断其值是否为0。请你写一个程序找出所有产生和为零的长度为N的数列。分析:DFS枚举就好了关键就是 处理‘ ’,用last保存最近的一个连续的整数,不将该数进行运算,sum表示last之前的运算结果若当前选择了 ' ':sum=sum-last+last*10+s+1(last>0);sum=sum
阅读全文
摘要:嘿嘿,还是比较基本的母函数/* ID: nanke691 LANG: C++ TASK: money */ #include<iostream>#include<string>#include<fstream>#include<string.h>#include<algorithm>using namespace std;const int maxn = 10000;int p[30],V,n;long long num1[maxn+1],num[maxn+1];void sovle(){ memset(num,0,sizeof(nu
阅读全文
摘要:哈,我的第一道母函数题目。题意:一个由1~N 组成的集合,问将这个集合分成俩个子集,使得俩个子集的和相等的方法数。、分析:分成俩个子集,子集的和相等,很明显,子集的和已经知道了。换种说法,就是求用1~N 这个数组合出和为(1+N)*N/4 方法数的一半。这就用到 母函数的思想,求出函数(1+x)*(1+x^2)*(1+x^3)……(1+x^N)的展开式中,指数为 (1+N)*N/4 的项的系数。/*ID: nanke691LANG: C++TASK: subset*/#include<iostream>#include<fstream>#include<strin
阅读全文
摘要:题意:初始化,所有灯都是亮的,之后总共只有四种操作1)所有的灯情况都取反2)编号为奇数的灯取反3)编号为偶数的灯取反4)编号为3*x+1 的灯取反现在,问,执行了C步操作之后,某些灯的亮的,某些灯的关的,求出所有的灯的可能组合。题意:每个按钮按2次和没按效果是一样的。所以每个按钮或者按或者不按,一共有2^4=16种状态。枚举每个按钮是否按下,然后生成结果,排序输出即可(注意判重)。/*ID: nanke691LANG: C++TASK: lamps*/#include<iostream>#include<fstream>#include<string>#in
阅读全文
摘要:题意:给出 N,B 和 D:找出 N 个编码(1 <= N <= 64),每个编码有 B 位[二进制](1 <= B <= 8),使得两两编码之间至少有 D 个单位的“海明距离”(1 <= D <= 7)。“海明距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目。看下面的两个编码 0x554 和 0x234 之间的区别(0x554 表示一个十六进制数,每个位上分别是 5,5,4):0x554 = 0101 0101 01000x234 = 0010 0011 0100不同位 xxx xx因为有五个位不同,所以“海明距离”是 5。分析:直接暴力搜索
阅读全文
摘要:题意:农民JOHN以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。输出:输出文件只有一行,包括牛必需的最小的饲料种数P后面有P个数,表示所选择的饲料编号(按从小到大排列)。如果有多个解,输出饲料序号最小的(即字典序最小)。分析:总共有十五种饲料,要找出符合能满足条件的最少的种数,相当于要求出一种组合,那么就求出各种长度的组合,再找出符合条件的最小字
阅读全文
摘要:题意:我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张“幸运爱尔兰”(一种彩票)。结果这张彩票让他获得了这次比赛唯一的奖品——坐落于爱尔兰郊外的一座梦幻般的城堡! 喜欢吹嘘的农夫约翰立刻回到有着吹嘘传统的威斯康辛老家开始吹嘘了, 农夫约翰想要告诉他的奶牛们关于他城堡的一切。他需要做一些吹嘘前的准备工作:比如说知道城堡有多少个房间,每个房间有多大。另外,农夫约翰想要把一面单独的墙(指两个单位间的墙)拆掉以形成一个更大的房间。你的工作就是帮农夫约翰做以上的准备,算出房间数与房间的大小。 城堡的平面图被划分成M*N(1 <=M
阅读全文
摘要:素数回文先产生所有范围内的回文数,再在范围内找出所有 的素数;嘿嘿,判断素数的方法就太牛逼了,好难理解/*ID: nanke691LANG: C++TASK: pprime*/#include<iostream>#include<fstream>#include<string.h>#include<stdlib.h>#include<math.h>using namespace std;long long b[10000]={5,7,11};int p[8]={4,2,4,2,4,6,2,6};int prime(int n)//判断
阅读全文
摘要:哎,纠结了那么久,终于过了,本来很直接的想到了BFS,可是怎么纠结也过不了,orz……还是用DFS了,嘿嘿,一开始好囧,没注意到,其实每一种方法最多只能走四次,走四次就回到初始状态了;DFS的过程比较好理解,从第一种方法开始,枚举这种方法走到次数,接着第二种方法,…………,这样,知道 第九种方法,再判断是否满足条件……/*ID: nanke691LANG: C++TASK: clocks*/#include<iostream>#include<algorithm>#include<fstream>#include<string.h>using n
阅读全文
摘要:郁闷死我了,求最长的回文串;本身读进来的是含有标点符号的一个文本串,之后找回文串的时候又忽略了那些标点符号,输出又要将那些标点符号输出…………蛋疼好久,幸好是可以看到什么例子没过,不过,我看是没希望过的了…………orz,文本里面的“\n”也是有效的……用前面的那个求最长回文串的算法就很容易过了,主要是 在处理那个标点符号的问题上……/*ID: nanke691LANG: C++TASK: calfflac*/#include<iostream>#include<fstream>#include<string.h>#define maxn 20010using
阅读全文
摘要:题意:给定N个区间,求最后区间内最长连续区间的长度以及最长不覆盖的长度分析:本来是可以直接暴力的,可是想练一下最近线段树到底做得怎么样了,所以就用线段树试了一下,哎,改了俩个多小时,终于出来了。注意:对区间长度的概念还是……因为离散化之后区间长度的求法变了,所以再求半个区间长度的时候,出错了/*ID: nanke691LANG: C++TASK: milk2*/#include<iostream>#include<fstream>#include<algorithm>#include<string.h>#define maxn 20000usin
阅读全文
摘要:去掉题目的背景:就是一个环形的串中,寻找一个最长的子串,该串由前后由俩部分组成,连续的b串和连续的r串,当然,一种颜色也可以;w可转变成任意颜色;我的思路:比较简单的思路,但是是一个复杂度O(n^2)的算法;先求出以每一个位置开始的最长串的长度,再找出可衔接的最长串即可;USACO上面有更快的O(n)算法。Holland's Frank Takes has a potentially easier solution: /* This solution simply changes the string s into ss, then for every starting// symbo
阅读全文