
USACO
文章平均质量分 79
深蓝色的猫
一个努力成长为大牛的蒟蒻程序媛
展开
-
USACO Shaping Regions
1、呼。。。终于过了这道,考察离散化+线段树的区间修改。因为是零基础,所以专门跑到POJ找了一道相似的题目做(POJ 2528)。。。终于写出来了~2、所谓离散化,就是将无限空间映射到有限区域,通俗一点讲,就是只记录边界线。本题对x和y坐标均离散化,然后枚举x点并更新(合法的)x点对应的线段树(也就是说x要在该操作所包围的范围内),接着统计每种颜色的数量。要注意setv【0】初始值应设为1(表原创 2014-01-29 00:56:24 · 399 阅读 · 0 评论 -
USACO Preface Numbering
1、可以发现带有四、九的数字都是比较特殊的。。。抽象出它们的共性,写成一个函数,每次只改变几个参数,然后暴力枚举即可。/*ID:mrxy564PROG:prefaceLANG:C++*/#include#includeusing namespace std;int n,a[4],b[9];char c[7]={'I','V','X','L','C','D',原创 2014-01-18 19:29:04 · 303 阅读 · 0 评论 -
USACO Runaround Numbers
1、唉,我真是太浮躁了,不好好读题,所以做错了两次。2、要注意题干中说digits是“unique”的,也就是各不相同,还说每次产生的新数不能和原数相同(其实和前一个条件是一个意思)。3、我还把memset写到循环外面了,造成死循环,其实只要测试一下81360这个数字就能发现问题了,但我就是抱有侥幸心理。。。4、以后要注意!/*ID:mrxy564PROG:runround原创 2014-01-18 22:43:19 · 411 阅读 · 0 评论 -
USACO Score Inflation
1、完全背包问题。。。1Y,《背包九讲》真的很不错。/*ID:mrxy564PROG:inflateLANG:C++*/#include#include#includeusing namespace std;int m,n,w[10010],c[10010],dp[10010];void CompletePack(int w,int c){原创 2014-01-27 12:22:11 · 406 阅读 · 0 评论 -
USACO Agri-Net
1、由于有了昨天写Dijkstra的经验,这次凭着理解就直接写出了求MST的Prim算法。。。/*ID:mrxy564PROG:agrinetLANG:C++*/#include#includeusing namespace std;const int INF=~0U>>2;int main(){ freopen("agrinet.in","r",st原创 2014-01-27 11:46:44 · 306 阅读 · 0 评论 -
USACO The Longest Prefix
1、这是98年的一道IOI题目,自己花了两个小时左右做出来的,没看题解,好有成就感啊~2、首先这道题可以暴搜,但是前几道题的经验告诉我这样是不可取的,于是考虑DP解法,发现DP其实就是“递推”,从初状态到末状态一层一层扫描、覆盖。。。DP最大的优势就是避免计算大量重复子问题,这也是我们省去的时间的来源。3、用了栈保存前一个状态,一个省时的方法就是判重,也就是算过的dp不用再算,dp【i】=原创 2014-01-19 11:23:42 · 303 阅读 · 0 评论 -
USACO Subset Summing
1、这道题让我对DP的理解更深一层。。。原来我从未真正理解过DP。。。2、本题给出一些数,让将数划分为两个集合,使每个集合的数之和相等,问有多少种划分方案。3、刚开始我看数据最多39个,就想用暴搜,结果n=36就是极限了。我用了各种优化,各种剪枝,包括考虑了枚举的顺序,已经是极限了。本来还想打表水过的,结果n=39的结果怎么也出不来(大概一分钟了也出不来)。后来到网上查题解才知道用dp。。原创 2014-01-18 21:40:48 · 287 阅读 · 0 评论 -
USACO Fractions to Decimals
1、考察长除法,就是一个很麻烦的模拟。。。注意数组要开足够大,我刚开始开10000都不行,后来开到1000000就过了。。。2、注意末尾的回车,USACO卡得真严!第二章终于做完了,接下来是更大的挑战。。。/*ID:mrxy564PROG:fracdecLANG:C++*/#include#includeusing namespace std;char s[原创 2014-01-26 23:59:27 · 257 阅读 · 0 评论 -
USACO Bessie Come Home
1、这道题用Dijkstra做,我居然做到一半忘了有重边,WA一次。。。2、Bessie和Farmer John的故事真有趣~/*ID:mrxy564PROG:comehomeLANG:C++*/#include#includeusing namespace std;const int INF=~0U>>2;char s1[2],s2[2];int原创 2014-01-26 22:30:06 · 389 阅读 · 0 评论 -
USACO Hamming Codes
1、刚开始想到暴力法了,就是不太敢写,以后要敢于估计时间复杂度,看到可以写就果断暴力。2、最后一个数据应该以\n结尾(虽然不能被10整除),WA一次,下次注意。/*ID:mrxy564PROG:hammingLANG:C++*/#includeusing namespace std;int N,B,D,cnt;int a[100];int dis(int原创 2014-01-16 23:38:01 · 245 阅读 · 0 评论 -
USACO Sorting A Three-Valued Sequence
1、本题是96年的一道IOI题目,应用贪心法,刚开始我没有利用好“每个数字的最终位置是确定的”这个条件,造成困难,后来看了以前的USACO教程才明白。2、优先交换“两个错位”的数字,再交换“三个错位”的数字,这样可得最优解。3、刚开始找到数字后没有跳出循环,造成错误,修改后AC~/*ID:mrxy564PROG:sort3LANG:C++*/#include#i原创 2014-01-16 20:42:54 · 297 阅读 · 0 评论 -
USACO Humble Numbers
1、这道题还真是考到了我不会的地方。。。实际上就是一个生成合数的过程。将1放在a【0】作为起始数,然后每次在后面跟上合法的生成数(就是“可以生成的”最小的合数),然后再将每个素数的“位置”变一下(如果有必要的话),方便下次生成。2、我刚开始想的是先胡乱生成(生成个数可能远远大于n,用set来防止重复),再排序,这样不行,素数一多,空间就吃不消。/*ID:mrxy564PROG:hu原创 2014-01-27 17:10:10 · 319 阅读 · 0 评论 -
USACO Contact
1、这是98年的一道IOI题目,本来以为要用到KMP,后来发现O(m*n)的算法就可以了。要注意的是0,00,000的二进制值是一样的,为了区分,需要在所有数前面加上一个“1”,这样相当于构建了一个新的映射s->1s,更方便计算(遵循KISS原则:Keep It Simple and Stupid,不要给自己找不痛快)。2、统计完毕后先按照频率排,频率相同按照长度排(这里可以直接按值的大小,想原创 2014-01-29 12:31:07 · 860 阅读 · 0 评论 -
USACO Stamps
1、这是一道DP,我感觉设计好状态真的很重要,刚开始我的dp【i】是表示“能否凑成数额i”,这就要求一定要等所有面值都算完后,再从头开始搜索看哪个面值不能凑成。比如面值56凑不成,而可能的面值有2000000种,那是巨大的浪费,算法是O(K*K*maxn*N)的,会超时。2、另一种状态是用dp【i】表示“凑成i最少需要的邮票张数”,这样只要把初始值设为INF,然后从头开始递推即可,一旦不满足要原创 2014-01-29 14:58:14 · 405 阅读 · 0 评论 -
USACO 【08 Nov Gold】Cheering Up the Cows
1、这道题挺有意思的,平时我们说的最小生成树都是建立在边权的基础上的,而本题由于答案的特殊性,需要另外“制造”一个边权,稍微画一个图走一遍就知道,除了开始结点外,每条边上所花的时间都是两倍边权+端点权值,以这个为新边权,求最小生成树,再加上一个权值最小的点即可(因为每个点肯定都在树上)。#include#includeusing namespace std;const int MA原创 2014-03-19 14:39:16 · 385 阅读 · 0 评论 -
USACO Magic Squares
1、这是96年的一道IOI题目,一道恶心的搜索。。。最近USACO快做哭了,根本没把我当初学者T T。。。谁说“做完前三章,稳拿一等奖”啊,岂止一等奖,明明可以参加NOI了。。。2、刚开始我脑子发昏,竟然倒序输出,所以怎么都不对,没法输出字典序最小,还以为是搜索顺序的问题,硬是把程序改复杂了。。。3、算法嘛,就是bfs+康托展开+逆康托展开即可。注意题目给出的数字顺序和常规不太一样,初始状原创 2014-02-08 17:51:03 · 438 阅读 · 0 评论 -
USACO Feed Ratios
1、这是98年的一道ACM的Final题目,可以暴力枚举,但是我想试试用高斯消元求非负整数解,所以就写了一个比较长的代码(当然运行时间很短)。2、要注意,由于是求非负整数解,在两行相减的时候,其第一个数不一定是成倍数关系,所以要利用最小公倍数。注意此时循环应从0到n,否则会漏掉一些地方。计算后再将整行除以最大公因数,防止数字过大导致溢出。3、最后还是要吐槽下:谁说USACO Trainin原创 2014-02-05 22:20:45 · 378 阅读 · 0 评论 -
USACO Spinning Wheels
1、这是一道模拟题,麻烦在于判断是否输出none。仔细观察会发现转360次后所有轮子回到原位,故只需枚举0到359即可。/*ID:mrxy564PROG:spinLANG:C++*/#includeusing namespace std;int a[5][11],b[5];void change(int d,int &l,int &r){ l=(l+原创 2014-02-04 22:25:41 · 343 阅读 · 0 评论 -
USACO Stringsobits
1、本题真的不擅长。。。看题解做的。首先用dp的方法求出位数为i,至多j个1的数的个数,然后再利用类似逆康托展开的方法,输出数字。2、注意I最多可达2147483648,故应该采用unsigned int保存。/*ID:mrxy564PROG:kimbitsLANG:C++*/#includeusing namespace std;int f[35][35];原创 2014-02-04 20:12:55 · 247 阅读 · 0 评论 -
USACO Money Systems
1、这是一个完全背包问题,按照《背包九讲》里的来就好,注意最后答案可能为long long型。/*ID:mrxy564PROG:moneyLANG:C++*/#include#includeusing namespace std;long long a[30],dp[10010];int v,n;void CompletePack(int cost,in原创 2014-01-20 23:13:33 · 340 阅读 · 0 评论 -
USACO Cow Pedigrees
1、这是一道树形DP的题目,刚开始我的状态转移方程是dp[i][j]=(dp[i][j]+dp[i+1][k]*dp[i+1][j-1-k])%MOD,但这样算出来的个数偏多,原因就是我多算了“深度不够的组合”,我的状态的第一维意思是以第i层结点为根结点,按理说,两个子状态应该至少其中一个会“到底”,但是我的状态并没有办法表示出来这层意思。所以第一维的含义应该改成“树的深度”,而不是“根结点所在的原创 2014-01-20 19:13:17 · 289 阅读 · 0 评论 -
USACO Factorials
1、做到这么水的题真感动啊。。。刚开始以为要用高精度乘法,吓坏了。。。其实不用,只要保留最后几位就可以了(注意不是保留最后一位),因为可能与两位数相乘的时候,前面进位使得最后为0,要是不保存前几位,乘后的结果就不对了。。。2、还要注意,最后输出的时候只输出一位。。。我刚开始忘了,WA一次。。。/*ID:mrxy564PROG:fact4LANG:C++*/#includ原创 2014-01-29 16:45:14 · 288 阅读 · 0 评论 -
USACO Zero Sum
1、本题一次AC~用dfs做,需要记录的参数很多,用一个数组来保存输出序列。‘ ’的情况要特别处理。2、感觉USACO题库确实很不错,才做到2.3,我就觉得自己的水平比以前提高了很多,有点期待刷通关是什么样。/*ID:mrxy564PROG:zerosumLANG:C++*/#includeusing namespace std;int N;char q[1原创 2014-01-20 22:07:21 · 299 阅读 · 0 评论 -
USACO Party Lamps
1、这是IOI98的一道题,写到1:20。。。其实主要框架在0点就写好了,但是由于没注意二进制数是要排序输出的,所以一直WA。。。2、还是比较麻烦的,首先要将状态压缩到2的4次方个,其次c小于4时要单独讨论,最后就是对二进制数排序了,其实就是字典序。。。3、刚开始还看错题了,3、4行输入都是描述最终状态的。。。/*ID:mrxy564PROG:lampsLANG:C++原创 2014-01-19 01:24:02 · 278 阅读 · 0 评论 -
USACO Cow Tours
1、拖了一天,终于靠着题解把这个题过掉了,so happy~2、考察Floyd算法求最短路,其间要注意讨论两点是否在一个连通块。3、要注意直径的定义,很微妙,不一定新形成的直径就大于原来的,因为新加的边的两端点可能不同于原来连通块的直径的点。/*ID:mrxy564PROG:cowtourLANG:C++*/#include#includeusing nam原创 2014-01-26 02:05:24 · 375 阅读 · 0 评论 -
USACO Healthy Holsteins
1、本题用回溯法,刚开始我被样例误导,数组开小了,WA了一次。2、用位运算可以节省vis数组。。。不过影响不大。。。/*ID:mrxy564PROG:holsteinLANG:C++*/#include#includeusing namespace std;const int maxnum=2147483647;int a[30],sum[30];i原创 2014-01-16 23:06:10 · 326 阅读 · 0 评论 -
USACO The Clocks
1、这道题在前面TEXT讲解过,可惜我完全忘记了,在那里用IDDFS,果断TLE了。状态的选取非常重要,从9^k到k^9再到4^9,性能得到了巨大的优化!2、今天做了两道IOI题目,感觉收获非常大。/*ID:mrxy564PROG:clocksLANG:C++*/#include#includeusing namespace std;int a[3][3],原创 2013-10-25 23:00:21 · 308 阅读 · 0 评论 -
USACO Packing Rectangles
1、USACO真是相当重口,才1.4节就给了一道95年的IOI题目,如果不是事先知道用搜索做,而且还有测试数据(21组!)的话,以我的水平,真的很可能做不出来。2、这个程序需要6个dfs,也就是每一种情况都要分别为它写一个dfs,最后一种“田”字型是最难的,要分成四类,刚开始因为思路不清晰在乱做,所以总是WA。一定要注意分类讨论要不重不漏,也就是大于等于的等于号不能少。3、注意,标号为1,原创 2013-10-25 17:30:43 · 305 阅读 · 0 评论 -
USACO Barn Repair
1、这道题USACO Training前面有讲解,所以不难,就是每次挑“缝隙最小的”堵住就可以了。一次AC~唯一美中不足的是:代码不是很美观。/*ID:mrxy564PROG:barn1LANG:C++*/#include#include#includeusing namespace std;int main(){ freopen("barn1原创 2013-10-09 21:14:46 · 362 阅读 · 0 评论 -
USACO Mixing Milk
1、基础贪心。。。不难,跟在菜市场买菜一个道理。。。/*ID:mrxy564PROG:milkLANG:C++*/#include #include using namespace std;struct milk{ int p,num; bool operator return p }}a[5010];int原创 2013-10-07 17:31:52 · 309 阅读 · 0 评论 -
USACO Dual Palindromes
1、有了上一道的铺垫,这个不难,依旧是暴力枚举,一次AC~2、开启新任务咯~/*ID:mrxy564PROG:dualpalLANG:C++*/#include using namespace std;bool is_pal(int *a,int cnt){ for(int i=0;i if(a[i]!=a[cnt-1-i]) ret原创 2013-10-07 12:11:22 · 329 阅读 · 0 评论 -
USACO Name That Number
1、这道题刚开始看到要从文件读入“字典”,有点心虚,其实比较简单。2、思路就是暴力枚举~刚开始我想枚举数字或字母,比较麻烦,后来借鉴了USACO上面讲解的某道IOI题目的思路,换了枚举对象,变成枚举单词(因为题目说了不到5000个),程序一下变得很容易。/*ID:mrxy564PROG:namenumLANG:C++*/#include#include#incl原创 2013-10-07 10:38:42 · 320 阅读 · 0 评论 -
USACO Transformations
1、刚开始看到这道题的时候还以为要用到旋转公式。。。其实不用,只要找准对应坐标即可。2、刚开始WA是因为把“镜像”和“旋转”分开来判断,看是否同时满足。其实题目的意思是“同时发生”,所以对应的坐标还是有区别的:也就是说“旋转”和“镜像”的对应坐标根本是不同的,永远不可能同时为true,“旋转&镜像”也有自己的坐标对应法则。/*ID:mrxy564PROG:transformLA原创 2013-09-19 11:55:17 · 279 阅读 · 0 评论 -
USACO Milking Cows
1、本题刚开始不知如何下手,经思考后想到可以根据区间左端排序,但要注意就是每次应该和“最右区间”相比,而不是和“前一个区间”相比。区间不一定是平行四边形的也可能是倒三角形的。/*ID:mrxy564PROG:milk2LANG:C++*/#include #include using namespace std;struct Interval{ int原创 2013-08-30 21:55:31 · 359 阅读 · 0 评论 -
USACO Broken Necklace
1、刚开始我是分类讨论,判断是否到边界,到边界后处理指针到另一端。。。写出来非常麻烦。后来想到将字符串*2,也就是让两串珠子连在一起,这样就不用判断头尾了,只要“顺时针”判断就可以了。2、刚开始WA了一次,因为我想当然地认为一定会有珠子颜色数>=2,其实可以是单色的。改后AC。/*ID:mrxy564PROG:beadsLANG:C++*/#includeusing原创 2013-08-30 14:19:18 · 345 阅读 · 0 评论 -
USACO Friday the Thirteenth
1、刚开始觉得无从下手,仔细考虑后发现其实只要遍历每一天,然后让星期数周而复始,遇到13就加一,再加一个对于闰年的判断即可。/*ID:mrxy564PROG:fridayLANG:C++*/#include #include using namespace std;int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,3原创 2013-08-30 12:51:15 · 367 阅读 · 0 评论 -
USACO Greedy Gift Givers
1、第一次用map和string类。。。还是很方便的。/*ID:mrxy564PROG:gift1LANG:C++*/#include #include #include #include #include #include using namespace std;int cnt;map id;int ID(string s){原创 2013-08-14 17:54:02 · 346 阅读 · 0 评论 -
USACO Mother's Milk
1、倒水问题的变形,把上一个程序(UVa 10603 Fill)改改就行了,一次AC~/*ID:mrxy564PROG:milk3LANG:C++*/#include#includeusing namespace std;struct node{ int v[3];};int vis[21][21];int cap[3],in[21];原创 2013-10-27 19:35:01 · 293 阅读 · 0 评论 -
USACO Number Triangles
1、数字三角形问题,有最优子结构性质,明显是DP。。。一次AC~ /*ID:mrxy564PROG:numtriLANG:C++*/#include#include#includeusing namespace std;int a[1010][1010],d[1010][1010];int dp(int i,int j){ int &ans原创 2013-10-28 21:25:19 · 251 阅读 · 0 评论 -
USACO Prime Cryptarithm
1、这题很怪,刚开始数组s开成5就一直是运行错,开成6就没问题了。。。2、暴力法,很简单。/*ID:mrxy564PROG:crypt1LANG:C++*/#include#includeusing namespace std;int cnt,in[10];bool is_valid(int num,int bit){ char s[6];原创 2013-10-23 23:27:41 · 289 阅读 · 0 评论