
usaco题解
xsy97051
这个作者很懒,什么都没留下…
展开
-
USACO1.2.2 Transformations (transform)
写两个转换的函数(翻转和旋转)注意顺序后组合着使用可拼凑出题目所需用的7种状况这样可以减少代码长度/*ID: xsy97051LANG: C++TASK: transform*/#include #include #include using namespace std; char st[20][20],ed[20][20];in原创 2015-01-26 19:29:34 · 376 阅读 · 0 评论 -
USACO1.3.2 Barn Repair (barn1)
总长度最小即总间隙最大。 选取最大的m-1段间隙,其余部分用木板盖住。/*ID: xsy97051LANG: C++TASK: barn1*/#include#include#includeusing namespace std; int dis[202],stn[202]; int main(){ int m,s,c,i,x; freopen("barn原创 2015-01-26 19:53:20 · 294 阅读 · 0 评论 -
USACO1.5.1 Number Triangles (numtri)
简单的动态规划倒着做,设f[i,j]表示到达第i层第j个最大的分数状态转移方程:f[i,j]=Max{f[i+1,j],f[i+1,j+1]}+a[i,j] (1/*ID:xsy97051LANG:C++TASK:numtri*/#include #includeusing namespace std; long long n,js,b[100原创 2015-01-27 18:53:05 · 295 阅读 · 0 评论 -
USACO1.5.2 Prime Palindromes (pprime)
手写判断素数和回文数的函数,从a到b开始判断注意:只有素数才可以是素数,所以循环中i+=2。/* ID: xsy97051 LANG: C++ TASK: pprime */ #include #include #include using namespace std; int pan(int n) { int arr[10原创 2015-01-27 19:01:57 · 264 阅读 · 0 评论 -
USACO1.4.2 Mother's Milk (milk3)
DFS因为牛奶的总量是不变的,所以可以用a,b,c中的牛奶量做状态,初始状态是(0,0,c)。每次只能有6种选择,a倒b,a倒c,b倒a,b倒c,c倒a,c倒b,用一个数组vis[i][j][k]判重。对于每一个答案,判断没有出现过在加入答案。搜索完毕快排,输出即可。/*ID:xsy97051PROB:milk3LANG:C++*/#include#includ原创 2015-01-27 17:45:47 · 324 阅读 · 0 评论 -
USACO1.5.3 SuperPrime Rib (sprime)
DFSN=1的时候,只有2,3,5,7N>1的时候,每一位只能是1,3,7,9.所以先求出N=1的素数,再用N=1的素数加上1,3,7,9,符合条件的数形成N=2的素数.再用N=2的用同样办法求出N=3的,以此类推/*ID:xsy97051LANG:C++TASK:sprime*/#include#includeusing namespace std;原创 2015-01-27 19:09:17 · 305 阅读 · 0 评论 -
USACO2.1.2 Ordered Fractions (frac1)
枚举所有的分数,判断其是否是最简(分母分子最大公约数=1),用一个定义好的struct记录所有最简分数;然后用快排排序后输出。/*ID:xsy97051PROB:frac1LANG:C++*/#include #include #include using namespace std;struct node{int x,y;} arr[160*160];int原创 2015-01-27 19:22:43 · 252 阅读 · 0 评论 -
USACO1.2.1 Milking Cows (milk2)
按照开始时间升序排序,然后从左到右扫一遍所谓从左到右扫一遍,就是记录一个当前区间,[a_begin ,a_end]如果下一组数据的begin比a_end的小(或相等),则是连接起来的,检查这组数据的end,取max{end , tmp_end}。如果下一组数据的begin比a_end的大,则是相互断开的,整理本区间,ans1取max{a_end - a_begin ,ans原创 2015-01-26 19:16:11 · 336 阅读 · 0 评论 -
USACO1.3.5 Wormholes (wormhole)
由于数据范围很小(1所以只要枚举所有组合情况然后暴力判断是否有环即可/*ID: xsy97051LANG: C++TASK: wormhole*/#include#include#include#include#includeusing namespace std;struct SaveNode{ int x, y; bool vis原创 2015-01-26 20:11:26 · 360 阅读 · 0 评论 -
USACO1.4.1 Arithmetic Progressions (ariprog)
时限为5s所以先把双平方数集合预处理出来,暴力搜索枚举即可,注意及时剪枝输出答案,应该先按b排序再按a排序/*ID:xsy97051LANG:C++TASK:ariprog*/#include#include#includeusing namespace std;int rl=0,a[20000],b[20000];int n,m,num[30000原创 2015-01-27 17:38:36 · 315 阅读 · 0 评论 -
USACO2.1.5 Hamming Codes (hamming)
我们只要按递增顺序搜索要求的n个数,然后跟前面的数判断距离是否大于d,在找到一组解后它肯定是最小的,输出。 数据不大,暴力搜索即可。注意:1. 0是必须出现的。2. b给出了搜索的最大值:2^b-13. 计算两个数a,b的距离,只要计算a xor b的数的二进制形式中1的个数,非常方便。/*ID:xsy97051PROB:hamm原创 2015-01-27 19:54:57 · 352 阅读 · 0 评论 -
USACO1.2.3 Name That Number (namenum)
预处理每个字母代表的数字扫一遍dict,再扫每一位。不过如果当前扫到的名字的长度和输入数字的长度不同就可以跳过了/*ID: xsy97051LANG: C++TASK: namenum*/#include #include const char code[26] = {'2','2','2','3','3','3','4','4','4原创 2015-01-26 19:37:29 · 294 阅读 · 0 评论 -
USACO1.2.4 Palindromic Squares (palsquare)
数据范围很小,1到300准换后判断即可,符合则输出/*ID: xsy97051LANG: C++TASK: palsquare*/#include#include#include#includeusing namespace std;char zf[21]={'0','1','2','3','4','5','6','7','8','9','A','B','C',原创 2015-01-26 19:40:38 · 287 阅读 · 0 评论 -
USACO1.2.5 Dual Palindromes (dualpal)
从s+1开始枚举,再枚举每一个进制/*ID: xsy97051LANG: C++TASK: dualpal*/#include#include#include#includeusing namespace std;char zf[21]={'0','1','2','3','4','5','6','7','8','9'}; map vis;string zhu原创 2015-01-26 19:44:21 · 373 阅读 · 0 评论 -
USACO1.3.3 Prime Cryptarithm (crypt1)
满足题意的情况很少,手动枚举即可/*ID: xsy97051LANG: C++TASK: crypt1*/#include #include#include #includeusing namespace std;map num; bool iscow( int t ){ int extra; while( t!=0 ){原创 2015-01-26 20:04:26 · 248 阅读 · 0 评论 -
USACO1.3.4 Combination Lock (combo)
数据范围小,直接枚举比对就好/*ID: xsy97051LANG: C++TASK: combo*/#include#include#includeusing namespace std;int n;bool judge(int x, int y){ int y1, y2, y3, y4; y1=y-2; if(y1<=0) y1+=n; y2=y-1;原创 2015-01-26 20:06:05 · 279 阅读 · 0 评论 -
USACO1.3.6 Ski Course Design (skidesign)
因为高度限制在1到100所以枚举每一个高度差i,i+17,然后计算费用/*ID:xsy97051LANG:C++TASK:skidesign*/#include#include#includeusing namespace std;int n,h[1005],ans=100000000;int main(){ freopen("skidesign.in","r原创 2015-01-26 20:15:18 · 399 阅读 · 0 评论 -
USACO1.3.1 Mixing Milk (milk)
简单的贪心算法将所有的牛奶按价格升序排列(用快排),然后从低到高买入,直到买够m为止。贪心的证明:假设某次买了价格稍高的牛奶,可以得到最优解。那么把这次买的牛奶换成价格更低的牛奶,其它不变,那么所得的解较优。假设不成立。/*ID: xsy97051LANG: C++TASK: milk*/#include#include#includeu原创 2015-01-26 19:47:36 · 337 阅读 · 0 评论 -
USACO2.1.1 The Castle (castle)
用一个二维数组记录每个格的四面是否有墙,根据输入,利用位运算得出每个格的墙的情况(8 = 23,4 = 22,2 = 21,1 = 20)。 然后用floodfill,对每个房间染色,求出房间数,和每个房间的面积,输出其中最大的。枚举每堵墙,如果墙的两边不是同一个房间且其面积和更大,更新结果,为了结果唯一,我们从左下向右上,一列一列枚举格子,并且先枚举该格上面的墙再枚举右边的。有多原创 2015-01-27 19:15:35 · 288 阅读 · 0 评论 -
USACO2.1.3 Sorting A Three-Valued Sequence (sort3)
用VIS[ ]记录数字1,2,3的出现次数显然最终的数列中1到VIS[1]均为1,VIS[1]+1到VIS[2]均为2,VIS[3]到n均为3对于原数列从1到VIS[1]+VIS[2]扫一遍 :1.如果是3,则是必须换的,a[3]++2.如果是2,且目前处于1到VIS[1]之间(本该全为1),则a[2]++3.如果是1,且目前处于VIS[2]到VIS[3]之间(本该全为2),则原创 2015-01-27 19:32:16 · 311 阅读 · 0 评论 -
USACO2.1.4 Healthy Holsteins (holstein)
对于每一种饲料G(1题目求问最少需多少种,所以dfs深度达到m时,就可以比较后return了/*ID:xsy97051PROB:holsteinLANG:C++*/#include #include #include using namespace std;int n,v[26],m,g[16][26],now[26],res[16],dat[16],m原创 2015-01-27 19:45:07 · 352 阅读 · 0 评论 -
USACO2.2.2 Subset Sums (subset)
简单的dp( 注意:计算所有数字的和,和为奇数则必定无法分为两个和相等集合,即可直接输出0 )dp[j]+=dp[j-i](1 最后输出答案dp[maxn]/2;/*ID:xsy97051LANG:C++TASK:subset*/#include #include #include using namespace std;long long n,d原创 2015-01-28 17:42:17 · 281 阅读 · 0 评论 -
USACO2.3.3 Zero Sum (zerosum)
N(3裸的dfs,不加任何剪枝和优化也时秒杀用sum记录当前加和,用last记录当前的连续数,就是之前添' '连成的数。/*ID: xsy97051LANG: C++TASK: zerosum*/#include #include using namespace std;char ans[18];int n; void dfs(int k, int sum,原创 2015-01-28 19:57:19 · 319 阅读 · 0 评论 -
USACO2.4.1 The Tamworth Two (ttwo)
记录方向和坐标,直接模拟,直到相遇。如何判断永远不相遇呢?对于牛或者人状态只有(10*10*4)400种,所以对于整个过程最多有(400*400)160000种状态。也就是说,如果超过160000步,那么肯定会出现有的状态出现了2次以上,那么就肯定是一个死循环,永远不会相遇。/*ID:xsy97051LANG:C++TASK:ttwo*/#原创 2015-01-29 17:13:54 · 400 阅读 · 0 评论 -
USACO2.4.2 Overfencing (maze1)
我们用一个数组记录每个格子四面连通情况,然后从输入文件中读入每条边(判断),维护这个数组。分别从两个出口做Flood fill,记录每个格子的最短距离。所有格子的最短距离的最大值为所求。Flood fill用BFS会更快一些,但DFS也慢不了多少,dfs到某一个格子时如果已经大于格子当前值即可将这个大分枝剪掉注意:读入和处理会有一些繁琐,但题目解释的很清楚/*ID原创 2015-01-29 17:19:52 · 361 阅读 · 0 评论 -
USACO2.2.4 Party Lamps (lamps)
模拟这个过程,DFS然后判断。之后对于答案排序输出用到一个小技巧:对于长度相等的字符串,可以当做数字比大小使用sort例如:在sort过程中,字符串“10001”是小于“10002”的同样:字符串“aaaaaa”小于“aaaaab”;/*ID:xsy97051LANG:C++TASK:lamps*/#include#inclu原创 2015-01-28 18:03:13 · 310 阅读 · 0 评论 -
USACO2.3.5 Controlling Companies (concom)
DFSa[i,j] 记录i控制j的股份对于每个公司i,搜索i直接控股的所有公司,将股份加到cnt[i]上,如果超过50,则:1.own[j]=1,表示i控制了j2.递归搜索公司j,每个公司至多只递归一次,所以用vis判重每搜完一个i公司,扫一遍own[j],输出控制了哪些公司/*ID:xsy97051LANG:C++TASK:con原创 2015-01-28 20:09:46 · 406 阅读 · 0 评论 -
USACO2.4.5 Fractions to Decimals (fracdec)
模拟除的过程,记录出现过的数字,判断即可,很好理解。注意:如果余数变为0,即已经除尽,就打印整个小数部分。如果小数位根本没有被生成,那么打印一个0就是正确答案了。/*ID:xsy97051LANG:C++TASK:fracdec*/#include #include #include using namespace std;int y[100002],c[1000原创 2015-01-29 17:53:17 · 327 阅读 · 0 评论 -
USACO2.2.3 Runaround Numbers (runround)
//这是一个小技巧,用此可直接得出数字x的位数int k=log10(x)+1;从n+1开始判断每个数字是否符合,符合即输出,程序结束。/*ID:xsy97051LANG:C++TASK:runround*/#include #include #include #include using namespace std;int n,q[10000],vi原创 2015-01-28 17:52:08 · 304 阅读 · 0 评论 -
USACO2.4.3 Cow Tours (cowtour)
核心是Floyd求任意两点最短路,如下://Floyd算法void floyd(int n) { for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);}MAP[ ][ ]记录两原创 2015-01-29 17:36:41 · 437 阅读 · 0 评论 -
USACO3.1.2 Score Inflation (inflate)
普通dp问题/*ID:xsy97051LANG:C++TASK:inflate*/#include #include #include using namespace std;int dp[10000];int main(){ freopen("inflate.in","r",stdin); freopen("inflate.out","w",stdout)原创 2015-01-29 19:28:36 · 309 阅读 · 0 评论 -
USACO3.1.5 Stamps (stamps)
简单的dp问题用f[ i ]记录邮资为i最少用多少枚邮票,当f[ i ]大于k时, i-1 即为答案/*ID:xsy97051LANG:C++TASK:stamps*/#include #include using namespace std;int f[2000005],a[50],i,j,n,k; int main(){ freopen("stam原创 2015-01-29 19:55:28 · 330 阅读 · 0 评论 -
USACO2.2.1 Preface Numbering (preface)
这道题的n只有3000多,从1~n把根据题目转换成字母,然后统计出现次数也不会超时。这里用其他高高效一些的方法,做一些预处理,就可将多次的计算合并到一次/*ID:xsy97051LANG:C++TASK:preface*/#include #include using namespace std;int code[10][3]={{0,0,0},{1,0,0},{2原创 2015-01-28 17:26:52 · 280 阅读 · 0 评论 -
USACO2.3.4 Money Systems (money)
简单的dp问题dp[ i ]表示组合出 i 可以有多少种方式则再下一种货币x出现时,则有 for i = x to n dp[ i ] += dp [ i - x ]dp[ n ]即为答案/*ID:xsy97051LANG:C++TASK:money*/#include #include #include using namespac原创 2015-01-28 20:02:44 · 375 阅读 · 0 评论 -
USACO3.1.4 Contact (contact)
题目难度一般,就是写起来有点麻烦枚举长度l从a到b,找出字符串中所有长度为l的字串然后用map记录,排序输出。/*ID:xsy97051LANG:C++TASK:contact*/#include #include #include #include #include #include #include using namespace std;vector原创 2015-01-29 19:46:40 · 723 阅读 · 0 评论 -
USACO2.3.1 The Longest Prefix (prefix)
简单的动态规划问题bool数组dp[i]表示从s串的开头到第i位是否是一个符合题目要求的字符串从头到尾扫一遍,枚举字符串数组str[]中存在的序列,临时变量okay表示此序列是否在原串中存在(按位来比较)如果存在(即okay==1),dp转移方程 dp[i]= dp[i] | dp[i-ll] (ll位当前较短序列的长度,位运算|即表示这两个任何一个为真,则dp[i]赋值1)倒序扫原创 2015-01-28 19:17:26 · 282 阅读 · 0 评论 -
USACO2.3.2 Cow Pedigrees (nocows)
动态规划问题首先明确一下题目的意思:用N个点组成一棵深度为i的二叉树,求一共有几种方法?设dp[i,j]表示用i个点组成深度最多为j的二叉树的方法数,则:1.每个结点的度为偶数 2.该树有n个结点 3.该树的深度为k 问题分析: 用动态规划和乘法原理求解,可以观察到一个树G(有x个结点,深度为k),如果去除它的根结点可以得到两个子数G1,G2,这两个子图的深度为k-1,他们的结点数的和原创 2015-01-28 19:33:07 · 376 阅读 · 0 评论 -
USACO 3.1.1 Agri-Net (agrinet)
这个问题需要找出所给图的最小生成树。我们使用这样的算法:在每一步,将不在树中的长度最小的边加入树中。由于树的尺寸足够小,我们不需要任何复杂的算法:我们每次都把每个节点考虑一遍。/*ID:xsy97051LANG:C++TASK:agrinet*/#include #include #include using namespace std;int n,m原创 2015-01-29 19:15:23 · 433 阅读 · 0 评论 -
USACO2.4.4 Bessie Come Home (comehome)
题差不多是一个裸的单源最短路,用Dijkstra、Floyd、SPFA做都可以其中Floyd是(N^3),Dijkstra和SPFA都是(N^2),但因为数据范围很小(只有52个字母),用哪一种都可以这里用的是Floyd(因为Floyd比较好写)/*ID:xsy97051LANG:C++TASK:comehome*/#include #include #defin原创 2015-01-29 17:48:30 · 405 阅读 · 0 评论 -
USACO3.1.3 Humble Numbers (humble)
我们在数组ans中计算出前n个丑数。为了实现起来更简单,我们把1也作为一个丑数,算法也要因此略微调整一下。当我们已知前k个丑数,想得到第k+1个,我们可以这样做:对于每个质数 p 寻找最小的丑数 h 使得 h*p 比上一个丑数大取我们找到的 h*p 中最小的一个,它就是下一个丑数/*ID:xsy97051LANG:C++TASK:hum原创 2015-01-29 19:37:00 · 364 阅读 · 0 评论