跳至正文

OI路程

USACO 3.2.6 Sweet Butter 解题报告

  • OI路程

刚刚打算用O(n^3)的算法,但超时百分百,马上就转型,用SPFA,每个节点用一次SPFA不会超时,因为这是一个稀疏图,800个节点却最多1450个,太给力了,每个节点用一次SPFA,然后判断是否为最优解,如此就够了,代码: / LANG: C ID: yylogoo1 PROG: butter /[......]

继续阅读

USACO 3.2.5 Magic Squares 解题报告

  • OI路程

就是纯模拟,先逆着模拟过去,再正着模拟回来就可以了,需要使用到康托展开: de lang="c">/ LANG: C ID: yylogoo1 PROG: msquare / #include #include #include int f[40320]; typed[……]

继续阅读

USACO 3.2.4 Feed Ratios 解题报告

  • OI路程

这题网上普遍的解法都是什么高斯消原,什么解线性方程,我可真不懂,只看到有个人说暴力上能够干掉,我就暴力了咯,代码如下: de lang="c">/ LANG: C ID: yylogoo1 PROG: ratios / #include #include int nee[……]

继续阅读

USACO 3.2.3 Spinning Wheels 解题报告

  • OI路程

转360次就一定会转回来,刚开始我还在想应该使用最小公倍数吧,后来想了想才发现用360就可以了,用最小公倍数麻烦的多,甚至可能还慢些! 然后忽然发现比较麻烦的一个地方就是每个轮子有5个孔,不好放在循环里,不知道怎么弄,看了下别人的建议,发现我好傻,直接使用数组记录就可以了,:-),每个空隙在数组中[……]

继续阅读

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 -[……]

继续阅读

USACO 3.2.1 Factorials 解题报告

  • OI路程

花了出奇的长时间,以前我是做过这题的,但是当时的话并没有实际的考虑清楚,因为我知道10就是由2和5组成的,我当时的算法就是用ans保存当前的尾数,然后遇到一个5就除以二,但是没考虑平方,那我就保存后5尾数就AC了,但是这个做法是欠妥的,你想啊,如果万一那个尾数是100002,虽然不切实际(如果切实际[……]

继续阅读

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=8[……]

继续阅读

USACO 3.1.4 Shaping Regions 解题报告

  • OI路程

这个题目用数组来记录纸的每一个颜色是不可能的,无论是时间上还是空间上都无法忍受,就只能用具体的矩形来表示了,比如底纸,就是一张(0, 0, a, b, 1)的底纸,代表起始坐标是(0, 0)末坐标是(a, b)颜色是1,将它加入数组作为第一个元素,当添加进了一个新的矩形的时候,将数组所有的元素都和这[……]

继续阅读

USACO 3.1.3 Humble Numbers 解题报告

  • OI路程

这个题目属于什么算法呢?我才疏学浅不知道,反正就是用num来记录丑数,假设1为丑数,代码实现会简单些,那么丑数必定就等于另外一个丑数乘以一个素数,那么再一个个的按大小找到前n个丑数,就可以了。 时间的话大概是O(nm),对每个素数都记录该和哪个丑数相乘start[i],如果sub[i](第i个素数[……]

继续阅读