作者: yylogo
-
USACO 2.3.4 Money Systems 解题报告
这个题目就是一个无限背包的例子,没有任何的修改,没有任何的特殊化,直接把代码搬进去就是的:
/ LANG: C ID: yylogoo1 PROG: money / #includelong long f[10000]; int main(void) { int i, j, t; int v, n; freopen("money.in", "r", stdin); freopen("money.out", "w", stdout); scanf("%d%d", &v, &n); f[0] = 1; for(i = 0; i <v i scanfd t forj="t;" j="n;" j fj="f[j" - t printflldn fn return code> -
USACO 2.3.3 Zero Sum 解题报告
这个题目刚看到谁都觉得简单,爆容易,但是仔细一想,怎么去组合数字?怎么去把符号和数字放在循环里?都是需要解决的问题,我刚开始使用的是全局变量保存那些数据,忽然发现用全局的数据太复杂了,有好多数据需要改变再还原,所以只能用局部变量,每个函数拥有一套独立的参数变量,这样及时修改了也影响不到别的函数(这里有一种操作系统的感觉,一个程序被多次执行,每个进程独立的空间)。 这题谈不上什么算法不算法的,就是纯粹的暴力循环,每种情况都考虑一次。唯一要说的就是这个srch的参数: 1.now就是枚举的标示量,表示这是第几层枚举了。 2.dea是前面一个的操作方式,比如1 2 3 4+5 6现在now = 5(指向数字中的6)了,那么dea就是代表加法。它用1,-1来表示加减法,非常的快速,不需要任何判断。 3.tmp就是用空格组合成的数字,又如上面一个例子,那么就tmp=5,如果再前进一层1 2 3 4+5 6 7,那么tmp=56。 4.总共的累加和,还没有包括tmp的值。 最开始dea=1,即要把累积的数加起来,如果是空格就把数累加进tmp,如果是加法或减法,就把tmp放进sum中,并且自己作为tmp,dea设置成为加法或减法(1,2),然后继续循环。
/ LANG: C ID: yylogoo1 PROG: zerosum / #includeint sum; int tmp, n, dea; int used[9]; void output(void) { int i; printf("%d", 1); for(i = 1; i <n i switchusedi case printf break case printf break case - printf- break printfd i printfn void srchint now int dea int tmp int sum int t ifnow="= n){" sum="sum" dea tmp ifsum="= 0){" output return usednow="0;" srchnow dea tmp now sum sum="sum" dea tmp usednow="1;" srchnow now sum usednow="-1;" srchnow - now sum int mainvoid freopenzerosumin r stdin freopenzerosumout w stdout scanfd n srch return code> -
USACO 2.3.2 Cow Pedigrees 解题报告
这题我折腾了一个星期,真的好死心,一个多星期一直在查到底是哪里出了问题,从感觉上算法是没有错误的,而且能够拿90分,那问题到底出在哪里呢?这一题我反反复复得找,再看标程,对着看,终于昨晚上找到了,算法没有一点问题,实现上有问题,超过了int 的范围,所以数据就出现了错误,然后就OVER了。 题目的思路是这样的,f[i][j]代表i个节点构成j层的树的个数,那么dp方程就是f[i][j] = {2 f[k][j – 1] f[i – k – 1][l]}(l = 1….j – 2, k = 1..i – 2) {f[k][j – 1] f[i – k – 1][l]} (l == j – 1, k = 1…i – 2) 这个算法的优化: 其实不需要从1循环到n,或者什么的,因为树和题目的特殊性质,不需要完全枚举,比如说当i=7的时候就不可能构成一层的树,就没必要考虑,当i=7的时候至少是3层,怎么计算呢?当已知节点数,log2(i) + 1的是最少的层数,(i – 1) / 2 + 1 是最大的层数。 当已知层数i时,最少的节点数是i 2 – 1,每层都有两个,但第一层只有一个;最多为2^i – 1,所以时间的优化还可以。 代码实现如下:
de lang="c">/ LANG: C ID: yylogoo1 PROG: nocows / #include -
USACO 2.3.1 Longest Prefix 解题报告
这个题目我也不知道这算法叫什么,反正就是用f[i]记录第i个字符能否到达,如果可以到达再把所有的元素一个个和i之后的进行比较,如果完全相同那么就把f中那个元素的长度加上i的值标记为1。 其实怎么说呢,就是有一个大的数组记录第i个是否能够有那些元素组成,如果可以就从这里再和所有的元素比较下,如果有相匹配的话就产生了一个更长的前缀,把它标记,然后再进行循环。 如果还是没有懂的话,那就看代码吧:
/ LANG: C ID: yylogoo1 PROG: prefix / #include#include char sub[200][11]; int count; char str[200001]; int len; int f[200001]; int main(void) { int i, j, k; int ans; freopen("prefix.in", "r", stdin); freopen("prefix.out", "w", stdout); while(scanf("%s", sub[count]) && sub[count][0] != '.'){ count++; } while(scanf("%s", &str[len]) == 1){ len += strlen(&str[len]); } f[0] = 1; / Misatck 1: 当答案是len时就会出问题 for(i = 0; i 20001的时候就可能会溢出了. for(k = 0; sub[j][k] != '\0'; k++){ / for(k = 0; sub[j][k] != '\0' && (i + k) -
Ubuntu下最好用的输入法fcitx-sunpinyin
今天难得折腾一会儿输入法,对于系统美化方面的东西我比较模糊,神马字体渲染阿,输入法模糊音阿对我来说统统比较模糊。隐约记得是@Houge_Langley在大力推上推荐这款输入法。
-
Ubuntu Fcitx输入法
Ubuntu用了好阵子的Ibus,但是Ibus在输入了点字之后再输入一次,有时候会出问题,相信不止一个人碰到过这种烦人的问题,那怎么办呢?本来一直都是凉拌的,今天忽然看到了Fcitx输入法,其实老早就看过了,不过以前看到就是3.5版本的,好久没有更新了,今天才发现不是没有更新,而是网站转移了,全部都转移进了Google Code,在那里继续开发,而Google里搜索到的Fcitx官网已经停止开发了。
-
生物如果拥有两个细胞核会怎样?
我以前写过一篇文章,关于细胞核和病毒之间是否有联系(到目前为止我也不知道有没有,说不定是个未解之谜),现在忽然又想到一个问题,当一个细胞拥有一个细胞核的时候所有生命活动都能够正常进行,但是把细胞核勾走之后就无法进行正常生命活动了,但是当把细胞核放回来又能够和原来一样,那么,如果一个细胞内同时存在两个细胞核会怎么办?