![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
USACO
文章平均质量分 69
dragonfly_xp
这个作者很懒,什么都没留下…
展开
-
USACO :The Tamworth Two解题报告
思路:根据题目意思模拟牛和农民的运动过程即可,关键的难点在于判断无法相遇的情况。由于格网大小固定为100x100,而运动的方向有4种,所以牛和农民在格网中所处的位置状态最多不会超过 4x100 x 4x100 = 160000种,所以只需判断总共移动的时间是否超过160000分钟即可判断是否存在死循环。 /*ID: xpli1PROG: ttwoLANG: C*/#原创 2011-03-04 23:53:00 · 283 阅读 · 0 评论 -
USACO :Cow Pedigrees解题报告
也是一道dp,思想是:节点数为i,深度为k的树的个数 = 节点数为j,深度为k1的树的个数 乘以 节点数为i-j-1,深度为k2的树的个数, 其中k1,k2可有节点数确定范围。dp的方程式为:dp[i][max(k1,k2)+1] += dp[j][k1]*dp[i-j-1][k2]; /*ID: xpli1PROG: nocowsLANG: C++*/#incl原创 2010-06-24 15:43:00 · 247 阅读 · 0 评论 -
USACO :Party Lamps解题报告
暴搜必定超时,这道IOI的题有两个优化技巧:1.根据4个开关的特性,每隔6盏灯状态必定是一样的。因此只需考虑前6盏灯即可。2.由于每个开关按奇数次等于按一次,按偶数次等于没按。因此每个开关只需考虑按或者没按两种状态。4个开关共枚举16种情况即可。两个判断是否得解的条件:1.枚举按开关的次数必须大于给出按的开关总次数C,且奇偶性相同(仔细想想就知道怎么回事) 2.与给出的一些灯的状态匹配原创 2010-05-12 13:30:00 · 287 阅读 · 0 评论 -
USACO :Subset Sums 解题报告
方法一: 1.N(1 2.划分后子集和为subsum,则dfs搜索其和为subsum的情况? 超时方法二: 若f[i][j]表示在前i个数中选取若干个数其和为j的方案数, 则状态转移为: f[i][j]=f[i-1][j]+f[i-1][j-i] (j-i>=0) 即:当i f[i][j]=f[i-1][j] (j-i 即:原创 2010-05-12 13:22:00 · 744 阅读 · 0 评论 -
USACO :Hamming Codes 解题报告
数据小,暴力搜索可以搞定。但是推荐使用DFS,每个节点(数)有取与不取两个分支。注意: 0是必须出现的。证明如下:最终得到的结果序列中,0是必须出现的,证明如下:如果存在另一个满足要求的结果序列S={a1...an},其最小值为a1 = N > 0,那么序列S' = S ^ N 是满足条件的最小解,且首元素为0/*ID: xpli1PROG: hammingLANG原创 2010-04-23 16:50:00 · 489 阅读 · 0 评论 -
USACO :Healthy Holsteins 解题报告
方法一:对于每种饲料,只有两种选择:喂或者不喂。所以最多只能有2^15种方案,简单的枚举就可以了。 方法二:基于方法一的DFS,DFS树的每一层为某一种饲料喂与不喂两个分支。方法三:我使用的是ID-DFS(迭代加深搜索),树的第k层表示喂了k种饲料。针对题目要求所喂饲料种类最少,每次DFS限定深度k,若搜索到可行解,那必定是最优解。当然,也可以用BFS,但太占空间。 /*ID:原创 2010-04-21 18:46:00 · 611 阅读 · 0 评论 -
USACO :Sorting a Three-Valued Sequence解题报告
一道很简单的贪心,在输入的时候统计共有几个1、2、3。设想排序后,数列分为1...1 2...2 3...3三个部分。因此对于原数列可以先交换1部分中的2和2部分中的1,交换1部分中的3和3部分中的1,交换2部分中的3和3部分中的2。最后就只剩下 2 3 1或者3 1 2这两种乱序中的一种,其实此时只需统计1部分中还剩多少个2或者3的个数,乘以2倍即为交换2 3 1或3 1 2的次数。/*原创 2010-04-21 12:32:00 · 216 阅读 · 0 评论 -
USACO :Fractions to Decimals解题报告
思路:模拟除法. 判断循环节的条件是出现相同的余数 。这题让我认识到string的加减法多么的耗时间 /*ID: xpli1PROG: fracdecLANG: C++*/#include #include #include #include using namespace std;#define IN fin#define OUT原创 2010-07-01 16:28:00 · 298 阅读 · 0 评论 -
USACO:Overfencing解题报告
思路:Dijkstra求最短路径,然后对于同一出发点求到两个出口之间的较小者,最后对于所有出发点求一个最大值,即所谓的worst point.当然这题在空间上需要优化,用堆来优化是一个可行的办法。其实用一个unsigned char型的数组来记录每两点间距离就可以保证恰好不超空间。当然,网上说可以用floodfill可以更容易得到答案。 /*ID: xpli1PROG: ma原创 2011-03-08 18:58:00 · 292 阅读 · 0 评论 -
USACO:Cow Tours解题报告
思路:先用floodfill得到各连通区域,然后用floyd-warshall得到各连通区域中各点间的最短路径,最后枚举连接不在同一连通区域中的两点并计算新的直径。需要注意的是:通过这样连接得到的直径也许不是整个牧场中最远两个牧区的距离,因为它有可能比期中某个子连通区域的直径小,即最远距离的两个牧区可能就在连接之前的某个连通区域中,因此在最后需要和每个连通区域中的最远距离比较从而得到最终结果。原创 2011-03-16 21:11:00 · 451 阅读 · 0 评论 -
USACO:Bessie Come Home解题报告
思路:很简单的最短路径问题,dijkstra即可解。本题规模很小,也可用floyd-warshalll来解。唯一需要注意的一点是:两个节点之间可能有多个不同权值的路径连接,输入的时候注意判断只取最小的那个权值。 /*ID: xpli1PROG: comehomeLANG: C*/#include #include #include #define ma原创 2011-03-17 14:40:00 · 307 阅读 · 0 评论 -
USACO:Score Inflation解题报告
思路:完全背包问题,DP状态转移方程,一维的:f[j] = max(f[j],f[j-time[i]]+score[i]) /*ID: xpli1PROG: inflateLANG: C*/#include #include #include #include #define max(a,b) (((a) > (b)) ? (a) : (b))原创 2011-03-18 19:00:00 · 313 阅读 · 0 评论 -
USACO :Runaround Numbers 解题报告
从M+1开始逐一判断是否是循环数,用数组来维护数的各个位数,可剪枝掉含0的数以及含重复数字的数。 /*ID: xpli1PROG: runroundLANG: C++*/#include #include #include #include #include using namespace std;#define OUT fout#def原创 2010-05-12 13:24:00 · 318 阅读 · 0 评论 -
USACO :Preface Numbering 解题报告
1.统计N以内(1,2...9) (10,20...90) (100,200,...900) (1000,2000,3000)出现的次数2.然后再统计I V X L C D M的次数 /*ID: xpli1PROG: prefaceLANG: C++*/#include #include #include #include #include原创 2010-04-24 21:20:00 · 371 阅读 · 0 评论 -
USACO :Ordered Fractions解题报告
水题,枚举加快排,注意舍弃分母和分子可以约分的情况。此外,还有一种类似杨辉三角的数学方法: 可以把0/1和1/1作为“端点”,通过把两个分数的分子相加、分母相加得到的新分数作为中点来递归(如图) 0/1 1/1原创 2010-04-20 13:40:00 · 415 阅读 · 1 评论 -
USACO:Agri-Net解题报告
思路:最小生成树,prim算法解. /*ID: xpli1PROG: agrinetLANG: C*/#include #include #include #define max(a,b) (((a) > (b)) ? (a) : (b))#define min(a,b) (((a) #define INT_MAX 0x7fffffff#d原创 2011-03-18 14:22:00 · 343 阅读 · 0 评论 -
USACO :Money Systems解题报告
背包DP,若定义dp[n][k]为用前k种货币组成n的方法数,则状态转移方程为: dp[n][k] = dp[n][k-1] + dp[n-c_k][k],其中c_k为第k 种货币的币值。即:前k种货币组成n的方法数 = 前k-1种货币组成n的方法数 + 前k种货币组成n-c_k的方法数关键需要理解的地方是:dp[n-c_k][k] 包含了 dp[n-i*c_k][k]所有的方法原创 2010-06-25 10:58:00 · 335 阅读 · 0 评论 -
USACO :Longest Prefix解题报告
一维的dp,设dp[i]表示主串S中从i开始的最长的可组成的前缀,dp[1]就是所求,状态转移方程:{dp[i]=max{dp[j]+j-i} 其中:i 到 j-1 的字串是属于集合P 且 j 要满足 iUSER: li xiaopeng [xpli1]TASK: prefixLANG: C++Compiling...Compile: OKExecuting.原创 2010-06-24 14:25:00 · 303 阅读 · 0 评论 -
USACO :Zero Sum解题报告
相邻数字之间只有‘ ’,‘+’,‘-’三种可能,故当N=9时,最多只有3^8种情况。可以DFS,也可以采用三进制数来枚举,怎么也不超时。/*ID: xpli1PROG: zerosumLANG: C++*/#include #include #include using namespace std;#define IN fin#define O原创 2010-06-24 17:05:00 · 396 阅读 · 0 评论