
USACO
会飞的蟋蟀
学习中!!
展开
-
USACO 1.2 Broken Necklace
USACO 1.2 Broken Necklace题目见落谷分析这是第一道开始有点麻烦的USACO的题目。朴素的想法是模拟数珠子的过程,遍历一边就可以得到最终答案了,但是 有几个坑要考虑好(好像USACO本身设计的案例还是很简单的),比如全白珠子,或是重叠数了白珠子。看了官方解 还有dp的解法,真是orz,先上个人的解,有时间再研究一下官方的。代码注释处...原创 2018-03-24 20:52:08 · 191 阅读 · 0 评论 -
USACO 2.1.5 海明码 Hamming Codes
题解这道题比较简单,就是暴力遍历,一个个试就可以了。 海明距离就是简单的位运算 异或一下就出来了。 代码也比较清晰了不解释。代码#include <iostream>#include <cstdio>#include <fstream>#include <cstring>#include <cstdlib>#...原创 2018-08-06 14:39:01 · 355 阅读 · 0 评论 -
USACO 2.2.1 序言页码 Preface Numbering
题解这道有点意思,本来很快写完的,被一个bug弄得怀疑人生了(结果发现是自己不仔细…)。 我的方法是 将数字转译成罗马数字,在这过程中做记录就好了。 肯定有纯数学的方法,直接递推出来,大家可以尝试一下。 大概的翻译算法为: 设给定待翻译数字为 n 1. 求出 n 最临近的区间 , 即n属于[sma, big ) // sma,big 显然是罗马数字中的基本数,要特殊处理相等情况 2...原创 2018-08-07 12:14:27 · 287 阅读 · 0 评论 -
USACO 2.2.2 集合 Subset Sums
题解仔细想一想就会发现这是一道dp,还是01背包类型的,是求方案数的。 看似是把数列分组,但是可视作把 N 个 重量分别为 1-N 的物体放入总重一定的背包中,且刚好放完的方案数计算。 递推式不难得出: f[i+1][j] = f[i][j] if ( i >...原创 2018-08-07 15:27:53 · 515 阅读 · 0 评论 -
USACO 2.2.3 循环数 Runaround Numbers
题解比较简单的模拟,注意这个环的条件比较苛刻。 感觉自己写代码还是不够仔细,没有想清楚就动手,花了好多时间debug。Code#include <iostream>#include <cstdio>#include <fstream>#include <cstring>#include <string>#inc...原创 2018-08-07 17:39:40 · 398 阅读 · 0 评论 -
USACO 2.2.4 派对灯 Party Lamps
题解这题还是比较有意思的,难在理解题意。 naive的遍历所有情况 O(4^N) 是绝对不行滴。 仔细想想,按一个按键 偶数次等于不按,按奇数次相当于按一次。所以某按钮按几次可以统统转化为按了0或1次。 再想想,按的次序有没有影响。答案是没有,模拟一下可知。 那么其实,所谓的 4^N 种 变化其实 就只有 0000~1111 这 16种而已。那么我们把这16种情况全部求出再作比较即可。...原创 2018-08-13 12:23:56 · 313 阅读 · 0 评论 -
USACO 2.3.2 奶牛家谱 Cow Pedigrees
题解这道题你想模拟建树的方法来做是肯定行不通的,有高度有节点数,两种限制,有点背包的意思。 F [ i , j ] 代表有 j 个节点 i 层的树 的表示数量 显然每棵树都可分为根节点和左右两子树,我们只需让左右子树的最高高度为 i-1 以及其节点和为 j-1 就好了。 这样的情况只有三种: 1. 左右子树高度均为 i - 1 2. 左子树高度为 i - 1 , 右子树高度小于 i...原创 2018-08-30 17:23:05 · 312 阅读 · 0 评论 -
USACO 2.3.4 Controlling Companies
题解数据弱暴力搜索搞定。也可以用并查集和图论算法搞定。Code// head files excludedusing namespace std;int n,m,k;int f[101][101];bool vis[101];bool ctr[101];int ct[101];void dfs(int x){ if(vis[x]) return; v...原创 2018-08-31 12:05:43 · 126 阅读 · 0 评论 -
USACO 2.3.3 货币系统 Money Systems
题解完全背包问题,讨论的是放完的方案数,只要把各种情况加起来就好了。 我给了一个2维空间的答案比较直观,可以压缩到一维,但需要推一下公式。Code// head files excludedusing namespace std;int n,m,k;long long f[2][10002];int cot[26];int main(void){ cin&g...原创 2018-08-31 12:10:04 · 278 阅读 · 0 评论 -
USACO 2.4.1 两只塔姆沃斯牛 The Tamworth Two
题解模拟即可。注意怎样判断不会相遇,我比较暴力直接确定一个大一点的时间超过了就break, 当然不会相遇肯定是进入了一个环,可以借此判断。Code// head files excludedusing namespace std;int n,m;int cot[11][11];int Mx[4]={-1,0,1,0};int My[4]={0,1,0,-1};int ...原创 2018-08-31 15:44:24 · 482 阅读 · 0 评论 -
USACO 2.4.2 穿越栅栏 Overfencing
题解此题不难,但是很恶心。迷宫的图数据太繁琐了,比较考验细心。 做法就是单纯的BFS,判断后加步数就好。但是要走两次,然后每处取最小,最后判断即可。Code#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <q...原创 2018-08-31 21:01:54 · 591 阅读 · 0 评论 -
USACO 2.4.3 牛的旅行 Cow Tours
题解图论入门级的题目。算最短路径,处理需要点技巧。代码很巧妙,琢磨一下啊。Code#include &lt;iostream&gt;#include &lt;cstdio&gt;#include &lt;cstring&gt;#include &lt;cstdlib&gt;#include &lt;cmath&gt;#inc原创 2018-09-05 11:59:54 · 370 阅读 · 0 评论 -
USACO 2.4.4 回家 Bessie Come Home
题解最短路径题,以Z为起点,用Dijkstra算法秒杀。注意会有重复边要取最小。Code// head files excludedusing namespace std;const int INF = 1e8;int n,m;int dis[53][53];int sd[52];bool vis[52];void init(){ for(int i=0;...原创 2018-09-05 16:47:05 · 293 阅读 · 0 评论 -
USACO 3.1.1 最短网络 Agri-Net 【模版】
题解最小生成树裸题。Kruskal方法解答,用并查集对节点检查合并。代码很简练。Code// head files excludedusing namespace std;int n,m,k;struct edge{ int x,y,v;} cot[20000];int f[200];bool cmp(edge &a, edge &b){...原创 2018-09-10 15:01:22 · 272 阅读 · 0 评论 -
USACO 3.1.2 总分 Score Inflation
题解完全背包裸题,不解释。Code// H F Eusing namespace std;int n,m,k;int f[10001];int v[10001],w[10001];int main(void){ cin>>n>>m; for(int i=1;i<=m;i++) cin>>v[i]>>w...原创 2018-09-10 15:49:17 · 369 阅读 · 0 评论 -
USACO 2.1.4 健康的荷斯坦奶牛 Healthy Holsteins
题解这道题我一直想着用dp来解,因为我觉得和01背包很像。 但是这个容量数据没办法用数组表示,所以一直想不到解法。 我默认dfs是会指数爆炸的不好解法,所以一开始就没考虑,但这题的数据很弱…代码#include <iostream>#include <cstdio>#include <fstream>#include <cstdl...原创 2018-08-06 11:20:22 · 472 阅读 · 0 评论 -
USACO 2.1.3 三值的排序 Sorting a Three-Valued Sequence
解析这是道贪心题,因为是求最少的交换次数,所以我们的每次交换都要最有价值。 Size数组记录123各自的数量,这样我们就知道123应该在哪些位置。 最有价值的交换是怎样的呢? 比如2在1的位置,而在2的位置里恰好有1,那么交换这两数字 会让两者同时归位。 不停地重复如此操作到最后会有两种情况,一是完全归位,二是仍有几个数无法归位,例如2-3-1 或者2-2-3-3-1-1。易知形如2...原创 2018-07-26 16:39:18 · 279 阅读 · 0 评论 -
USACO 1.3.1 Milking Cows
USACO 1.3.1 Milking Cows解析看来是个测试用例很弱的题,可以直接用数组表示时间段,然后遍历计算最长时间即可。 luogu的题解中差分的方法,但是我还不知道什么是差分orz 官方的题解是用stuct 表示一个时间段,存入数组,然后按起始时间sort,再遍历处理这个结构数组 还是很巧妙的。代码个人的暴力解法/* PROG:milk2 ID:imk...原创 2018-03-25 11:32:42 · 186 阅读 · 0 评论 -
USACO 1.3.2 Transformations 方块旋转
分析朴素的思想就是模拟翻转矩阵,官方的题解也是这样的。 但是如果数据量大的话,这种方法有点浪费。luogu上有个比较好的想法–剪枝 即在做变形的时候同时做判断,如果和当前char与目标矩阵不同就直接跳过,可以节省时间。代码只写的来暴力模拟orz/* PROG:transformID:imking022LANG:C++*/ #include <iostr...原创 2018-03-25 15:38:08 · 171 阅读 · 0 评论 -
USACO 1.4.2 Barn Repair
解析一道贪心题,看了看luogo的题解,发现我的解法还是不太一样的。 大致思路是:既然要求在限定的板数内覆盖的空栏最少,那么其实问题可以转换为, 对一个连续完整的板(覆盖从头到尾),想办法切割成几块板子,使得切出来的空隙尽量大。 这样解的话,就只需要把连续空缺栏的长度排个序就可以了。代码/*PROG:barn1ID:imking022LANG:C++ */#...原创 2018-03-31 18:49:00 · 204 阅读 · 0 评论 -
USACO 1.4.4 Combination Lock
题解很简单的一道题,不知道为什么分在贪心里,没见用到什么贪心方法。 只要遍历n^3个密码依次检测就可以了,注意这是环形密码首尾也相邻。代码/*PROG:comboID:imking022LANG:C++ */#include <iostream>#include <cstdio>#include <cstdlib>#includ...原创 2018-04-01 15:24:30 · 271 阅读 · 0 评论 -
USACO 1.3.3 Name That Number 命名那个数字
解析给定数字,翻译出对应的名字,在有限的名字字典中寻找最终可用正确的名字。 这道题有多种方法,我这里介绍三种: 1. 这是我自己想出来的方法,可是TLE。想法很简单就是,翻译出所有对应的名字,然后依次考察改名字是否在字典中。 我把dict.txt处理成了map,这样在查询的时候就比较方便了。但是显然数字越长,可能情况越多。 2. luogu上看来的,直接把dict.txt处理成数字,然...原创 2018-03-26 22:02:44 · 426 阅读 · 0 评论 -
USACO 1.3.4 Palindromic Squares
解析这题就比较简单了,进制转化加回文检测,就OK了。代码/* PROG:palsquareID:imking022LANG:C++*/ #include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cstdlib...原创 2018-03-27 20:37:43 · 116 阅读 · 0 评论 -
USACO 1.4.5 Wormholes
题解目前为止最难的题,有多种做法,这里给出一个比较好理解的方法—配对法 大体思路是深度递归创造所有的配对b[],然后对每个配对检验是否有回路。代码/*PROG:wormholeID:imking022LANG:C++ */#include <iostream>#include <cstdio>#include <fstream>...原创 2018-04-06 17:03:29 · 382 阅读 · 0 评论 -
USACO 1.5.2 Mother's Milk 母亲的牛奶
题解直观的想法是枚举出所有可行三元数组,那么用dfs深度遍历就可以了。 但是要注意怎样去重,这里用一个visit[][]二维数组表示AB两桶的奶量 (因为总量一定所以二维就够了)是否出现过。 当然还有很多方法,比如可以当成奥数题算出来…代码/*PROG:milk3ID:imking022LANG:C++ */#include <iostream>#in...原创 2018-04-23 19:31:37 · 238 阅读 · 0 评论 -
USACO 1.4.6 Ski Course Design
题解其实这道题很好的解释了什么叫做程序思维。 做法就是暴力枚举,遍历所有可能的区间,计算最小的cost即可。代码/*PROG:skidesignID:imking022LANG:C++ */#include <iostream>#include <cstdio>#include <fstream>#include <cst...原创 2018-04-21 19:37:14 · 214 阅读 · 0 评论 -
1.6.1 USACO Number Triangles
题解似乎是一道dp入门题目,想法就是 要求出最长的路径和, 那么直接将之前的路径上的长度取最长累加到目前的选择的路径上。 说起来有点绕,看看代码就很容易理解。 ( 但是我的代码为了省空间直接写成了一维的…代码/*PROG:numtriID:imking022LANG:C++ */#include &lt;iostream&gt;#include &lt;cstdi...原创 2018-05-10 17:22:29 · 150 阅读 · 0 评论 -
USACO 1.6.2 Prime Palindromes
题解这道题有点意思,原题给了提示的,没看前我是先算质数再做回文判断, 看了提示豁然开朗,先列回文数可以减少质素判断,明显是更明智的做法。 这题思路很清晰的,难点在如何不重不漏构造回文数,详见代码。代码/*PROG:pprimeID:imking022LANG:C++ */#include &amp;lt;iostream&amp;gt;#include &amp;lt;cstdio&amp;gt;...原创 2018-05-12 17:40:49 · 175 阅读 · 0 评论 -
USACO 1.6.3 Superprime Rib 特殊的质数肋骨
题解这题就比较简单了,就是个深度搜索。注意到每次构成都是素数,显然可以剪枝。 数据很小,非常简单。代码/*PROG:sprimeID:imking022LANG:C++ */#include <iostream>#include <cstdio>#include <fstream>#include <cstring>...原创 2018-05-15 16:10:57 · 295 阅读 · 0 评论 -
USACO 2.1.1 城堡 The Castle
题解比较有意思的一道题目。大体概念是图搜索和洪水填充。 前两个问题用dfs就可以解决,后两问遍历对所有房间,检验N和E墙即可。 思路很清楚,但写起来还是要仔细。代码/*PROG:castleID:imking022LANG:C++ */#include <iostream>#include <cstdio>#include <fs...原创 2018-07-23 14:10:59 · 654 阅读 · 0 评论 -
USACO 2.1.2 顺序的分数 Ordered Fractions
题解这道题其实很容易,枚举全部分数并且排序即可。 但是我用优先队列来做了,发现stl的priority_queue超时,然后自己手撸了个heap, 结果把下调写错了,debug了半天,尴尬-。- |||代码/*PROG:frac1ID:imking022LANG:C++ */#include <iostream>#include <cstdio...原创 2018-07-25 16:19:35 · 460 阅读 · 0 评论 -
USACO 2.4.5 分数化小数 Fractions to Decimals
题解想出来的解法比较暴力。 前提知识:能够用整数表示出的小数都是有理数,所以不会存在无限不循环小数(无理数)。 判断是否无限循环,遍历小数点后100-200位若全是0那肯定不是无限小数 ( 确实存在后面这么多0的无限小数,但不在题目数据范围内 ),否则肯定无限。 若无限循环就要找环,环长怎么样?从头到尾数相同,暴力遍历即可。 最后注意 N 要开大点。Code// head ...原创 2018-09-07 15:24:35 · 471 阅读 · 0 评论