自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

荒野孤鹰

广阔天地大有作为

  • 博客(39)
  • 资源 (1)
  • 收藏
  • 关注

原创 USACO--2.4Bessie Come Home

一道简单的最短路,因为数组下标问题检查了一个小时,悲剧。。。。。 两种做法:一种是用Z作为源点求到其它点的最短路,一种是直接用Floyd算法求出所有点之间的最短路。我才用了第一种做法代码如下;/*ID:15674811LANG:C++PROG:comehome*/#include<iostream>#include<cstdio>#include<cstring>#include<a

2015-03-27 18:16:01 756

原创 USACO--2.4Cow Tours

题目大意:一个图被分成若干个连通块,我们可以选择在这些连通块中增加一条边,求加边以后所有点最小距离最大值最小的情况(有些绕口~)。 思路:最暴力的思路就是依次枚举需要连边的连通块然后再枚举这两个连通块中需要连接的定点,然后再用Floyd算出所有点的最小距离,然后再求最大值。这样时间复杂度是n^7,肯定会超时。仔细想一下我们其实并不关心我们枚举的边是属于哪个连通块的,我们只需要保证枚举的边不在同一个

2015-03-27 16:30:32 862

原创 USACO--2.4The Tamworth Two

这题目一看就是一个模拟题,但是问题在于我们什么时候结束这次的模拟判断他们不可能相遇。开始的时候我想了几种可能循环的情况作为结束的判断条件,但都是超时;然后我想可不可设置一个时间上限来作为结束模拟的条件,然后我就设了一个上限100000,没想到AC了,后面我给改成1000还是可以AC。。。。。。。 后面看了一下官方的解答,我的思路是对的,但是上限设小了。考虑将一个格子的坐标加上站在这个格子中时面向的

2015-03-26 16:29:07 774

原创 USACO--2.3Cow Pedigrees+DP

令dp[i][j]表示i个节点构成高度不大于j的树的方法数。如果我们将给定的树去掉根节点,那么这棵树就可以分成独立的左右两棵子树,然后如果左子树具有a中形态,右子树具有b中形态,那么这棵树总共有a*b种形态。 所以我们得到状态转移方程dp[i][j]=dp[k][j-1]*dp[i-k-1][j-1].其中k可以看成是在穷举左子树中含有的节点数为k个。边界条件是dp[1][1,k]=1;代码如下:

2015-03-26 15:10:34 686

原创 线段树模板

下面的两份线段树模板,一份是单点更新维护区间最小值,一份是区间更新,同时维护区间和,区间最大最小值。代码如下:///线段树单点更新#include<iostream>#include<cstdio>#include<cstring>#include<fstream>using namespace std;#define maxn 1000#define INF 0x3f3f3f3fint

2015-03-25 23:47:13 568

原创 coj--1532: JuQueen+线段树

很久没写线段树了,没想到这两场比赛都遇到了线段树的题目。看来是有必要重新复习一下了。。。。。 对于这道题的话其实就是线段树,我们只需要维护一下区间的最小值和最大值就可以应对题目的问题了。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 5000000#define

2015-03-25 23:42:51 592

原创 USACO--2.3Money Systems+dp

完全背包的简单变形,秒杀。代码如下:/*ID:15674811LANG:C++PROG:money*/#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#include<fstream>using namespace std;int main(){ o

2015-03-24 19:20:41 660

原创 USACO--2.3Controlling Companies+dfs

这个题目的困难之处在于处理间接持股的情况可能有多层,开始的时候我也没想清楚怎么处理这种情况后面参考了别人的想法才写出来的。其实对于间接持股的情况,我们可以在每次遇到直接控制情况时,用dfs将其转化为直接持股的情况,当然如果在dfs过程中遇到股份大于百分之五十的情况时还要继续dfs跟新下去。代码如下:/*ID:15674811LANG:C++PROG:concom*/#include<iost

2015-03-24 19:01:00 698

原创 USACO--2.3Zero Sum

一个简单dfs,只是填充符号后的求和写的有点复杂了。/*ID:15674811LANG:C++PROG:zerosum*/#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#include<fstream>using namespace std;int n,tm

2015-03-23 16:37:11 555

原创 USACO--2.3Longest Prefix+DP

很久没做dp了,然后开始看到这题目都不知道该怎么下手了;其实这是一道dp的典型题,每次都可以有多种选择但是不到最后是不知道最优解的。 令dp[i]表示以i为起点的最长前缀,然后dp[i]=max(dp[i+len[j]]+len[j]) 当然i+len[j]要小于原字符串的长度。代码如下:/*ID:15674811LANG:C++PROG:prefix*/#include<iostrea

2015-03-23 15:09:48 660

原创 COJ--1541: There is No Alternative

一个图的最小生成树可能不是唯一的,但是无论在那种组成中都可能会包含固定的几条边,这个题目就是要我们求出共有几条这样的边和他们的权重之和。 我们可以先求出一颗最小生成树,然后记录下组成这颗生成树的所有边,然后再依次去掉这些边,看还能不能得到同样权重的最小生成树,如果可以那么去掉的这条边就不是必须的。代码如下:#include<iostream>#include<cstdio>#include<c

2015-03-23 00:13:52 748

原创 java集合学习之Map

与Collection接口一样,Map也是java中重要的集合接口,Map中的数据以key–value对的形式存在,每个key值都是唯一的,但是value值允许重复。如果我们把Map中所有的key值放在一起,那么他们就组成了一个Set集合(所有key没有顺序,key与key之间不能重复),实际上Map确实包含了一个keySet()方法,用于返回Map中所有key组成的Set集合。Set和Map集合联

2015-03-18 17:41:12 523

原创 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

对于以前,如果要我求第k小元素,或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,但是现在有了更好的思路。一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法。其具体的分治思路如下: 1.分解:将A[p,r]分解成A[p,q-1]和A[q+1,r]两部分,使得A[p,q-1]都小于A[q],A[q+1,r]都不小于A[q]; 2.求解:如果A[q]恰好是

2015-03-18 13:06:03 2742

原创 java集合学习之Collection(3)

这篇博客主要介绍List集合和Queue集合一.List集合 List集合是一个有序的可重复的集合,集合中的每个元素都对应一个索引,我们可以通过索引来访问List集合中的数据(其实可以看成一个长度可变的数组)。 List作为Collection的子接口,支持Collection的所有操作,但因为List是有序的所以新增加了一些新的操作,主要是根据索引来插入,删除,替换元素的方法。Li

2015-03-17 23:25:51 585

原创 USACO--2.2Runaround Numbers

开始的时候认为数据太大,直接模拟会超时,但其实还是可以直接模拟的,原因在于这种Runaround Numbers分布还比较稠密。另外要注意读题.代码如下:/*ID:15674811LANG:C++PROG:runround*/#include<iostream>#include<cstdio>#include<cstring>#include<fstream>using namesp

2015-03-17 16:35:05 830

原创 Java集合学习之Collection(2)

上篇博客讲了Collection接口的一些基本操作,这篇博客主要介绍Collection接口的子接口Set。 Set是一种无序的集合,其基本操作和Collection接口是差不多的,主要的不同点在于Set中不能重复元素而Collection集合是可以的。对于Set集合我们主要关心它的HashSet,TreeSet两个实现类。一.HashSet HashSet是Set接口的典型实现,大多数时

2015-03-16 18:13:45 575

原创 USACO--2.1Subset Sums

开始的时候,用dfs去做,结果果断超时;后面看了一下,原来就是一个0--1背包的变形题。代码如下:/*ID: 15674811LANG: C++TASK: subset*/#include#include#include#includeusing namespace std;int main(){ ///ofstream cout

2015-03-14 18:00:57 643

原创 算法导论学习之线性时间排序+排序算法稳定性总结

前面我们学习的几种排序算法都是基于比较的,对于任何输入数据他们都是适用的,其最坏的时间复杂度不会低于nlgn; 但对于一些比较特殊的输入数据,我们可以不采取比较的方法而是采用其它的方法对其进行排序,以达到线性的时间复杂度。下面就来介绍三种这样的算法:计数排序,基数排序,桶排序(因为这几种算法不常见,我只实现了计数排序,其它两种排序用伪代码表示)。一.计数排序 算法思想:给定n个位于0–k之

2015-03-13 17:55:47 1232

原创 USACO--2.1Hamming Codes

开始的时候没有什么思路,后面看了一下数据范围不大,直接就暴力了。 其实我们只需要从题目中给定的0–2^B-1这些数中从小到大选n个出来就行了,只需要满足每次选择的数和前面已选的数的Hamming距离必须不小于D。代码如下:/*ID: 15674811LANG: C++TASK: hamming*/#include<iostream>#include<cstdio>#include<cs

2015-03-13 12:35:24 603

原创 USACO--2.1The Castle

思路:这个题目难在建图,开始的时候我想把每个房间没有墙的面求出来,然后再和他邻近的房间加上一条边进行建图,后面发现要通过题目给定的条件求出房间那个面没有墙是十分困难的;后面参考了别人的思路,我们记录每个房间那几面是有墙的(这个很容易做到),然后就不显示建图了,直接通过dfs标记的思想求出这个图所有的连通块(Flood fill 算法)。后面的处理就比较简单了,求出这个连通块后就可以知道总共有几个房间

2015-03-13 10:58:18 976

原创 算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小。一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地

2015-03-11 23:48:49 4542 1

原创 USACO--2.1Healthy Holsteins+状态压缩穷举

最多有15种食物,然后对于每种食物有选或者不选两种情况,所以总的情况数只有2^15种,我们可以借助状态压缩,穷举出所有的状态,然后求出最好的情况。代码如下:/*ID: 15674811LANG: C++TASK: holstein*/#include<iostream>#include<cstdio>#include<cstring>#include<fstream>using na

2015-03-11 14:00:46 798

原创 算法导论学习之堆+堆排序+堆构成优先队列

注:堆分为最大堆和最小堆两种,下面我们讨论的堆都是指的最大堆,最小堆的性质与其是类似的。堆数据结构是一种数组对象,可以被视为一棵完全二叉树(这棵二叉树除最后一层外,其余每层都是填满的);我们用一个数组来存储一个堆,表示堆的数组有两个属性:length[A]表示的是数组中的元素个数,headsize[A]表示堆中元素个数(也就是说数组中的元素不一定都是堆中的元素)。 下面不加证明的给出一些堆的性质:

2015-03-11 00:05:50 2326 1

原创 USACO--2.1Ordered Fractions

给定n,其能构成真分数的数目不会超过n^2/2;我的方法就是将所有的分数都构造出来,然后从下到大排序,然后输出(输出的时候要判重);官网的解法思路跟我的是一样的,但是他在构造分数的时候,没有取那些可以约分的分数,这样效率更好一点。代码如下:/*ID: 15674811LANG: C++TASK: frac1*/#include<iostream>#include<cstdio>#incl

2015-03-10 20:37:30 826

原创 USACO--2.1Sorting a Three-Valued Sequence

我们可以知道最后排序以后的结果,也就是所有的1,2,3所处的位置; 所以我们可以预先统计1,2,3的数量,然后对于处在1位置的2,3我们先分别到他们各自应该处在的位置,寻找是否有1然后交换,如果没有再到别的位置寻找;处理完1后,我们再统计一下应该是2的位置上有多少3,就可以得到答案了。代码如下:/*ID: 15674811LANG: C++TASK: sort3*/#include<ios

2015-03-10 14:44:42 773

原创 USACO--1.5Superprime Rib

直接dfs穷举所有的数,然后再判断是不是素数,注意dfs时不同层的剪枝。代码如下:/*ID: 15674811LANG: C++TASK: sprime*/#include<iostream>#include<cstdio>#include<cstring>#include<fstream>#include<algorithm>#include<cmath>using name

2015-03-09 18:07:50 751

原创 USACO--1.5Prime Palindromes

一个性质:偶数位的回文数都是11的倍数(11本身除外),所以偶数位的不用考虑,接下来我们就构造奇数位的回文数,然后判断这个数是不是素数就行了。代码如下:/*ID: 15674811LANG: C++TASK: pprime*/#include<iostream>#include<cstdio>#include<cstring>#include<fstream>#include<cma

2015-03-09 16:53:45 658

原创 USACO--1.3Barn Repair

首先我们肯定可以用一块板就把所有的牛棚覆盖了去,但是我们可以购买m块板,所以我们可以选择去掉m-1段中间没有牛住的连续的牛棚的木板,具体选择哪m-1段?肯定是选择间隔最大的那m-1段了。另外还要注意处理m可能大于总的牛棚数,这时不需要去掉m-1段,只需要去掉c段代码如下:/*ID: 15674811LANG: C++TASK: barn1*/#include<iostream>#incl

2015-03-08 13:22:51 563

原创 USACO--1.3Mixing Milk

就是一道简单贪心,肯定是要先买价格低牛奶,所以先按价格排序就行了。代码如下:/*ID: 15674811LANG: C++TASK: milk*/#include<cstring>#include<cstdio>#include<iostream>#include<fstream>#include<algorithm>using namespace std;typedef str

2015-03-08 12:30:18 730

原创 USACO--1.2Transformations

题意很容易理解,思路也是简单的,基本上就是直接模拟。但一开始我怎么也推不出原地旋转的坐标变换表达式(空间想象力不够。。。。。),导致卡了很久。 对于一个n*n的矩形(下标从1开始),其中一点(x,y)原地旋转90°后的坐标:(y,n-x+1);原地旋转180°后的坐标:(n-x+1,n-y+1);原地旋转270°后的坐标:(n-y+1,x).得到这个公式后代码就好写了,当然我们其实只需要写一个旋转

2015-03-07 15:59:21 863

原创 USACO--1.2Name That Number

题意还是很简单的,我们可以用dfs穷举出所有可能的名字;重要的是查询名字是不是合法,开始的时候用的map,没想到超时了;于是后面用的字典树,其实应该也可以用二分进行查找。另外好像USACO对内存限制很严,数组不能开太大。代码如下:/*ID: 15674811LANG: C++TASK: namenum*/#include<iostream>#include<cstdio>#include

2015-03-07 15:09:06 660

原创 算法导论学习之插入排序+合并排序

最近准备花时间把算法导论详细的看一遍,强化一下算法和数据结构的基础,将一些总结性的东西写到博客上去。一.插入排序 算法思想:如果一个数组A,从A[1–n-1]都是有序的,然后我们将A[n]插入到A[1–n-1]的某个合适的位置上去那么就可以保证A[1–n]都是有序的。这就是插入排序的思想;具体实现的时候我们将数组的第一个元素看出有序,然后从第二个元素开始按照上面的步骤进行插入操作,直到插入

2015-03-06 22:36:26 1021

原创 USCO--1.2Dual Palindromes

基本思路同上一题一样,改改上一题的代码就能过了代码如下:/*ID: 15674811LANG: C++TASK: dualpal*/#include<iostream>#include<cstring>#include<cstdio>#include<fstream>using namespace std;ofstream fout("dualpal.out");ifstream

2015-03-06 21:27:45 653

原创 USACO--1.2Palindromic Squares

水题,任意进制转换+回文判断 头脑不太清晰,代码写的很乱。。。。。代码如下:/*ID: 15674811LANG: C++TASK: palsquare*/#include<iostream>#include<cstring>#include<cstdio>#include<fstream>using namespace std;ofstream fout("palsquare.o

2015-03-06 17:07:41 488

原创 USACO1.2--Milking Cows

将输入的时间按起点排序后就可以直接模拟了,注意区间嵌套的情况,开始的时候没考虑,导致WA了好几次。代码如下:/*ID: 15674811LANG: C++TASK: milk2*/#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<fstream>using namespace

2015-03-05 15:11:02 682

原创 USACO--1.1Broken Necklace+暴力

n只有350,所以我们可以直接枚举每个点作为打断点,然后再统计其左右同颜色珠子的最大值,然后取这些最值中的最大值。代码如下:/*ID: 15674811LANG: C++TASK: beads*/#include<iostream>#include<cstdio>#include<cstring>#include<fstream>using namespace std;int mai

2015-03-05 14:29:28 848

原创 USACO--1.1Friday the Thirteenth+简单模拟

n只有400,所以可以直接暴力模拟。 因为一个小问题卡了很久。。。。。。代码如下:/*ID: 15674811LANG: C++TASK: friday*/#include<iostream>#include<cstdio>#include<cstring>#include<fstream>using namespace std;bool is_leap(int year){

2015-03-04 10:51:27 815 2

原创 USACO--1.1Greedy Gift Givers+模拟

简单模拟题。注意0%0是非法运算代码如下:/*ID: 15674811LANG: C++TASK: gift1*/#include<iostream>#include<cstring>#include<cstdio>#include<fstream>#include<map>using namespace std;int main(){ ofstream fout("gi

2015-03-04 09:30:04 712

原创 USACO1.1--Your Ride Is Here +水题

完全是一道水题,主要是熟悉了一下USACO的文件操作。 话说这也是这个学期的第一道题,希望这次自己能完完全全的实行好计划,能够好好的坚持下去,否则的话恐怕真的是前途堪忧了。。。。。 加油!!!代码如下:/*ID: 15674811LANG: C++TASK: ride*/#include<iostream>#include<cstring>#include<fstream>usi

2015-03-03 21:52:57 825

深入浅出MyBatis

深入浅出mybatis这本书详细的描述了如何使用mybatis作为数据层半持久化框架

2018-06-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除