跳至正文

USACO 3.2.4 Feed Ratios 解题报告

  • OI路程

这题网上普遍的解法都是什么高斯消原,什么解线性方程,我可真不懂,只看到有个人说暴力上能够干掉,我就暴力了咯,代码如下: de lang="c">/ LANG: C ID: yylogoo1 PROG: ratios / #include #include int need[3]; int have[3][3]; int ans[3]; int best = 300, last_ans; int tmp[3]; void check(void) { int i, t, s; int[……]

继续阅读

Fedora 删除旧内核

  • Linux

由于Fedora更新升级非常的频繁, 所以, 非常有必要清除陈旧的内核,方法如下:

1. 查看当前系统中已安装的内核相关包: [root@knityster ~]# rpm -qa | grep kernel kernel-headers-2.6.32.12-115.fc12.i686 kernel-firmware-2.6.32.12-115.fc12.noarch kernel-PAE-devel-2.6.32.11-99.fc12.i686 kernel-devel-2.6.32.12-115.f[......]

继续阅读

USACO 3.2.3 Spinning Wheels 解题报告

  • OI路程

转360次就一定会转回来,刚开始我还在想应该使用最小公倍数吧,后来想了想才发现用360就可以了,用最小公倍数麻烦的多,甚至可能还慢些! 然后忽然发现比较麻烦的一个地方就是每个轮子有5个孔,不好放在循环里,不知道怎么弄,看了下别人的建议,发现我好傻,直接使用数组记录就可以了,:-),每个空隙在数组中+1,最后等于5的就是。但是现在觉得可能这么也不好,因为如果出现了某一个轮胎上两个孔重叠不就可能出问题了,但是这个只出现在数据上,不合逻辑所以就没有这种数据吧,所以我AC了,但是这还是要考虑下,如果这样的话,还是是用数组[……]

继续阅读

USACO 3.2.2 Stringsobits 解题报告

  • OI路程

这题最开始,我是爆搜,从1向上递增地搜,没过,超时了;后来用深搜,直接搜位数小于等于l的,也超时了,实在没有办法了,到网上看了题解,天!好简单阿! f[i][j]代表i位长的且1最多为j的二进制数的个数,那么就有一个DP方程,f[i][j] = f[i – 1][j] + f[i – 1][j – 1] 因为第i位要么是1要么是0,如果是0那个数就是f[i – 1][l],如果是1就是f[i – 1][j – 1]。 之后,根据f[i][j]就可以确定输出了,从f[n][l]开始,如果m<=f[n -[……]

继续阅读

USACO 3.2.1 Factorials 解题报告

  • OI路程

花了出奇的长时间,以前我是做过这题的,但是当时的话并没有实际的考虑清楚,因为我知道10就是由2和5组成的,我当时的算法就是用ans保存当前的尾数,然后遇到一个5就除以二,但是没考虑平方,那我就保存后5尾数就AC了,但是这个做法是欠妥的,你想啊,如果万一那个尾数是100002,虽然不切实际(如果切实际我就不能AC),但是确实不够严谨。 想了好久,想到了一个算法,不会怕特殊情况了,先把所有的5的个数统计出来,然后除去相应的2就可以了。 代码如下: / LANG: C ID: yyogoo1 PROG: fact4[......]

继续阅读

USACO 3.1.6 Stamps 解题报告

  • OI路程

这一题我就用的动态规划:f[l]=max(f[l], f[l – num[i]]); f[0] = 1; l是总面额,i是第num[i]个邮票的面值,但是超时,没想到别的算法,怎么办?找地方剪枝,见了三处就AC了,这效果立竿见影啊!后来到网上看了下,还有更快的方法,我是三重循环,它是二重循环,用f来记录当前使用的邮票总数(这种方法到别出去吧~- –

[……]

继续阅读

USACO 3.1.5 Contact 解题报告

  • OI路程

这个题目其实算法还是比较简单,关键是怎么保存这些数字,其实啊,最好的保存方法就是二进制,且增加前缀1,比如0就是二进制10即十进制2,想必聪明的你要问为什么需要前缀1了,为什么呢?如果不要的话那么000都是二进制的0,怎么区分呢?所以用前缀1,那么最大的话也就是12位的1加一个前缀12^13=8192,接下来自己想想吧。

[……]

继续阅读

USACO 3.1.4 Shaping Regions 解题报告

  • OI路程

这个题目用数组来记录纸的每一个颜色是不可能的,无论是时间上还是空间上都无法忍受,就只能用具体的矩形来表示了,比如底纸,就是一张(0, 0, a, b, 1)的底纸,代表起始坐标是(0, 0)末坐标是(a, b)颜色是1,将它加入数组作为第一个元素,当添加进了一个新的矩形的时候,将数组所有的元素都和这个新的矩形比较,如果该元素被盖住了,就把数组中的那个元素拆分成几个没有被盖住的元素。 其实描述的很笼统,代码明天加入吧,在Ubuntu里面,现在不想切换过去了。 代码如下: de lang="c"[……]

继续阅读