usaco
heben99
这个作者很懒,什么都没留下…
展开
-
usaco 3.4 Closed Fences 计算几何
题目给定一个多边形,要求1)判断是否简单多边形方法如下 对于临边:假设p1,p2和p2,p3为临边,如果p1,p2,p3重合并且p1,p3在p2的同侧,在存在交叉边,可以通过叉积cross(p1,p2,p3)==0 和点击dot(p1,p2,p3) 对于不相邻的边:如果规范相交,则存在交叉边. 2)判断观察者是否能看到,题目的意思是只要能看到一点就满足条件,但是如原创 2008-08-20 16:58:00 · 1138 阅读 · 1 评论 -
usaco 4.2 Job Processing 贪心
这道题目的思想是贪心,如果只有一道工序,那么很容易想到,只需要每次用当前空闲,并且能最早完成任务的机器处理即可,现在有两台机器,应该如何处理? 先看下面一个简单的引理:对于两数组a[n],b[n], a[n]按升序排列,b[n]按降序排列,设数组c[i] = a[i] + b[i],则将an和bn分别重新排列后,再次得到 d[i] =a`[i]+b`[i],则 max(cn) 现在原创 2008-08-22 17:11:00 · 843 阅读 · 2 评论 -
usaco 3.4 rockers 动态规划
f[disk][song][ti] 表示用前disk张光盘,录制前song首歌曲(不一定录制第song首歌曲)的最大曲目数,并且当前在录的光盘剩余时间是ti f[disk][song][ti] = max( f[disk][song-1][ti], f[disk-1][song-1][T-a[song]] && disk > 1 && a[song]原创 2008-08-20 20:22:00 · 370 阅读 · 0 评论 -
usaco 4.3 Buy Low, Buy Lower 动态规划
典型的动态规划,难点是第二步,cnt[i]表示以a[i]结尾的最长下降序列的种数,则cnt[i] = count( len[k]+1==len[i]), 1 还有一个问题,如果生成的实际序列值相等,则算作一种,可以通过一下方法处理:计算出a[i]之后和第一个和a[i]相等的数a[k],令next[i] = k; 如果没有相等的则next[i] = 0计数时如果 next[j]!原创 2008-08-24 16:43:00 · 463 阅读 · 0 评论 -
usaco 4.3 Letter Game 搜索
搜索题目,状态很多,需要优化:1.优化搜索顺序:先确定对角线,因为对角线对行列的影响最大。然后每次选取已确定数字个数最多的行列进行枚举,这样最省时间2.合理设计数据结构:假设我们需要迅速查找到第一位和第五位分别为1,3的素数集合,该如何处理?预处理是搜索问题优化的好方法,可以在搜索前将各种需要枚举的素数集合分别存起来,这样速度将会快很多3.如果某行或者某列已经有四个数确定了,那么第五个数可以直接原创 2008-08-25 13:55:00 · 564 阅读 · 0 评论 -
usaco 4.3 Street Race
求有向图割点和分裂点,由于数据很小,直接枚举,去掉某点,然后判断即可,需要注意的地方是分裂点一定是割点 #include #include #include #include using namespace std;/*PROG: race3LANG: C++ID: heben991*/const int N = 110;i原创 2008-08-23 17:38:00 · 669 阅读 · 1 评论 -
usaco 4.3 Letter Game 搜索
简单搜索题,几乎不需要优化,直接枚举一个或者两个单词,判断其组成字符的个数是否小于给定串对应的字符个数,满足则更新答案。搜索过程中如果需要单词里的字符不再给定串里,则提前跳出。 /*PROG: lgameLANG: C++ID: heben991*/#include #include using namespace std;const原创 2008-08-24 09:36:00 · 493 阅读 · 1 评论 -
usaco 4.2 Drainage Ditches 网络流
很明显的网络流问题,点数和边数都是200,采用Edmonds_karp的复杂度上限是O(VE^2),实际上一般情况下要比此上限小得多,所以N=200时也能很快解决 #include #include #include #include using namespace std;/*PROG: ditchLANG: C++ID: heben原创 2008-08-22 15:05:00 · 386 阅读 · 0 评论 -
usaco 4.2 The Perfect Stall 二分图最大匹配
这里采用网络流方法解决,建立虚拟源点src,从src到每头牛添边,建立虚拟汇点des,从每个摊点向des添边,每条边的权值都是1,求从src到des的最大流即可 #include #include #include #include using namespace std;/*PROG: stall4LANG: C++ID: he原创 2008-08-22 15:30:00 · 473 阅读 · 0 评论 -
usaco 4.1 Cryptcowgraphy 剪枝
这道题目需要大量优化,要用到ELFhash字符串哈希,空间不能开太大,否则会很慢,但是在我的机器上试,空间不影响速度,有可能是因为usaco服务器的问题总结一下错误的地方1)下标错误:把c,o,w搞混了2)边界错误:对于字符数组,需要判断0 优化措施总结如下1)字符串的字符个数应该等于(目标字符串的长度)+3*k。如果不满足就可直接判断无解。 2)除了COW三个字符外,其他的字符的个原创 2008-08-21 22:55:00 · 970 阅读 · 0 评论 -
usaco 4.1 Fence Loops 最小环
给点各边的连接关系,求最小环,如果给定的是点的关系,可以用floyd简单的求出,但是现在给定的是边的关系,如果转换成点的关系,将会很麻烦,然而最小环也可以用dijkstra来求,枚举每条边,求出到自己的最短路即为最小环的长度 #include #include using namespace std;/*PROG: fence6LANG: C原创 2008-08-21 16:07:00 · 661 阅读 · 0 评论 -
usaco 4.1 Fence Rails 剪枝
多维背包问题,不能用dp,因为n 1)对rail和board排序,对于不同长度的rail,一定是取长度小的rail比较划算,所以我们取前k个rail处理这里 sum(rail,k) sum(board) 2)充分利用题目条件:因为每个rail最长只有128,而rail可能会有1000,所以肯定有很多rail的长度相等,对于这些rail,我们只需要枚举一个下界即可,这样可以免去很多重原创 2008-08-21 13:27:00 · 1157 阅读 · 0 评论 -
usaco 4.1 Beef McNuggets 搜索
开始看到题目感觉不是很好做,抱着试试的态度用递推的方法写了一个程序,没想到居然过了。。。。用f[i]表示大小i能否取到,则 f[i] = f[i] || f[i-a[k]], 1 推到一个较大的数N,如果每个数都能取到或者较大的数内(接近N)存在不能取到的数,则输出0,否则输出不能取到的最大值 #include #include #include原创 2008-08-20 21:13:00 · 453 阅读 · 0 评论 -
usaco 3.4 Electric Fence 皮克定理
一条直线((0,0),(n,m))上的格点数(包含端点)等于n与m的最大公约数+1皮克定理: 面积A和内部格点数目i、边上格点数目b的关系:A = i + b/2 - 1 #include #include #include using namespace std;/*PROG: fence9LANG: C++ID: heben原创 2008-08-20 19:25:00 · 746 阅读 · 0 评论 -
usaco 4.4 Shuttle Puzzle 找规律
可以用宽搜尝试,结果n>9时发现严重超时,超空间。观察一下输出结果 n = 92: 9 113: 12 10 84: 7 9 11 135: 14 12 10 8 6 6: 5 7 9 11 13 157: 16 14 12 10 8 6 4 8: 3 5 7 9 11 13 15 17 9: 18 16 14 12 10 8 6 4 2 10: 1原创 2008-08-25 16:23:00 · 617 阅读 · 0 评论