
USACO
acm_lkl
这个作者很懒,什么都没留下…
展开
-
USACO3.3--Shopping Offers
如果我们将每一种优惠方案看成一种物品,那么这个问题就可以转换成背包问题,我们可以定义dp[a1][a2][a3][a4][a5]表示购买第一到第五中物品ai个时的最小代价,然后转移方程类似于完全背包dp[a1][a2][a3][a4][a5]=min(dp[a1-st[i].num[a1]][a2-st[i].num[a2]…[a5-st[i].num[a5]);但是这样还不够,因为根据题目要求其实原创 2015-05-26 23:36:14 · 629 阅读 · 0 评论 -
USACO--3.1Humble Numbers
这个题的难点在于如何顺序的产生Humble Numbers。考虑我们已经得到前k个Humble Numbers,如果得到第k+1个Humble Numbers?对每个素数,在前k个Humble Numbers中选择一个数与其相乘的结果恰好大于第k个Humble Numbers,然后我们的第k+1个数就是这些结果中的最小值。当然如果对每个素数每次都要遍历一遍前k个Humble Numbers,肯定会超原创 2015-04-10 19:21:01 · 593 阅读 · 0 评论 -
USACO--3.1Agri-Net+prime算法
就是一个prime算法。代码如下:/*ID:15674811LANG:C++PROG:agrinet*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 110#define INF 0x3f3f3f3fint lowcost[maxn],vis[maxn];int原创 2015-04-10 15:49:58 · 671 阅读 · 0 评论 -
USACO--3.1Score Inflation+完全背包问题
就是一简单的完全背包问题,秒杀。代码如下:/*ID:15674811LANG:C++PROG:inflate*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 11000int main(){ freopen("inflate.in","r",stdin);原创 2015-04-10 16:08:12 · 839 阅读 · 0 评论 -
USACO--2.3Controlling Companies+dfs
这个题目的困难之处在于处理间接持股的情况可能有多层,开始的时候我也没想清楚怎么处理这种情况后面参考了别人的想法才写出来的。其实对于间接持股的情况,我们可以在每次遇到直接控制情况时,用dfs将其转化为直接持股的情况,当然如果在dfs过程中遇到股份大于百分之五十的情况时还要继续dfs跟新下去。代码如下:/*ID:15674811LANG:C++PROG:concom*/#include<iost原创 2015-03-24 19:01:00 · 732 阅读 · 0 评论 -
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 · 715 阅读 · 0 评论 -
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 · 678 阅读 · 0 评论 -
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 · 636 阅读 · 0 评论 -
USACO--2.1The Castle
思路:这个题目难在建图,开始的时候我想把每个房间没有墙的面求出来,然后再和他邻近的房间加上一条边进行建图,后面发现要通过题目给定的条件求出房间那个面没有墙是十分困难的;后面参考了别人的思路,我们记录每个房间那几面是有墙的(这个很容易做到),然后就不显示建图了,直接通过dfs标记的思想求出这个图所有的连通块(Flood fill 算法)。后面的处理就比较简单了,求出这个连通块后就可以知道总共有几个房间原创 2015-03-13 10:58:18 · 1029 阅读 · 0 评论 -
USACO--3.1Stamps+DP
因为要求连续,所以我们必须顺序的判断每一枚邮票的面值,考虑已经得到前i个可能的面值,那么我们怎么判断第i+1个面值可不可得到?我们可以知道i+1面值的这枚邮编,可以由0—i面值中的邮票加上某一个可取的面值得到,但是由题目的限制,我们要保证构成构成i+1面值邮票的cent数必须少于k。 我们定义dp[i]表示构成面值为i的邮票所需的最小的cent数,然后dp[i]=min(dp[i-a[j]]+1)原创 2015-04-13 12:43:40 · 706 阅读 · 0 评论 -
USACO--3.1Contact
字符串处理。我是直接用的map记录的所有的子串,然后再从map中取出结果排序,然后就输出。其实这个题都是0-1串,开始的时候我是想着能不能用hash的方法来记录每个子串,但是后面觉得00 000 0000 这些情况不好处理,后来看了官网题解发现我们可以在这个串的最前面的加上一个1然后就可以用二进制hash的思想求解了。 PS:这道题的输出格式蛮坑的。。。。。。代码如下/*ID:15674811原创 2015-04-13 15:50:27 · 1360 阅读 · 0 评论 -
USACO--3.1Factorials
我才用了一种比较笨的做法,直接用高精度将阶乘给算出来了,然后直接求出最后非零位。其实开始的时候我的猜想是每次我们只需要用上次结果的最后非零位乘上这次的最后的非零位,应该就可以得到答案呢。但是这样的猜想是不对的,因为如果最后一位是5的话就会打破这个规律,如果我们就可以将每个数中的2,5因子都去掉,就可以用上面的猜想了。但是又要注意到2的因子数比5的多,所以我们在最后还得将多除了的2乘回去。因原创 2015-04-13 23:51:57 · 668 阅读 · 0 评论 -
USACO--3.2Sweet Butter+推优化的Dijkstral算法
这个题目思路是很简单的,我们只需要枚举每个定点作为目的地,然后再取其中距离总和最小的作为答案.开始的时候我用的是floyd一次就将所有点之间的最小距离求出来,但是超时了. 后面用的每次枚举一个点就用堆优化的求一次这个点到其余点的最短路,这样就可以过了.代码如下:/*ID: 15674811LANG: C++TASK: butter*/#include<iostream>#include<原创 2015-05-19 20:09:25 · 667 阅读 · 0 评论 -
USACO--3.2Feed Ratios
WF上的水题,直接模拟即可.注意为0情况的处理,我写的有点复杂了.代码如下:/*ID: 15674811LANG: C++TASK: ratios*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define INF 0x3f3f3f3fint xx[5],yy[5],zz[5],k4,s原创 2015-05-18 21:50:17 · 770 阅读 · 0 评论 -
USACO--3.3Home on the Range+DP
二维dp,定义G[i][j]表示i,j为顶点的最大正方形边长.如果G[i][j]本身为1,则转移方程为:G[i][j]=min(G[i+1][j],G[i][j+1],G[i+1][j+1])+1.其实就是由其下方,右方,右下方的点确定它所能构成的最大正方形(在图上可以很清楚的发现这一点). 其实这道题也可以暴力枚举;我们枚举每个点作为正方形左上角顶点时可以得到的最大边长正方形,而边长为k的正方形原创 2015-05-29 23:41:26 · 816 阅读 · 0 评论 -
USACO3.2--Spinning Wheels
题目的关键在于360秒后,所有的轮子都会回到原位.然后就可以暴力模拟每一秒的的情况了,因为是周期性还要注意一些细节需要注意.代码如下:/*ID: 15674811LANG: C++TASK: spin*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef struct{原创 2015-05-18 14:02:11 · 803 阅读 · 0 评论 -
USACO--3.3A Game+dp
一道dp,其实我们只要求出第一个人的最大和.定义sum[i][j]表示区间i,j所有元素之和.dp[i][j]表示从面对区间i,j时先取所能得到的最大和. 状态转移方程: dp[i][j]=max(sum[i+1][j]+a[i]-dp[i+1][j],sum[i][j-1]+a[j]-dp[i][j-1]). 可以化简成: dp[i][j]=sum[i][j]-min(dp[i+1][j],dp[原创 2015-05-29 21:10:15 · 638 阅读 · 0 评论 -
USACO--3.1Stringsobits
开始的时候暴力了一次,但是在第10个点就超时了.后面才知道这个题实际上是一个组合数的题目.在每个位置我们可以选择放0或者1,并且我们可以统计出每种放法后面数的排列数,然后我们可以决定放0或放1,继续这个过程直到最后. 所以重点是计算出dp[i][j],表示i位中至多有j位1.对这个我们可以采用dp的方法来求dp[i][j]=dp[i-1][j]+dp[i-1][j-1]; 也可以使用组合数来求d原创 2015-04-21 21:43:20 · 674 阅读 · 0 评论 -
USACO--2.4Fractions to Decimals
开始看这个题目的时候一点思路都没有,毕竟double型才能保留16位的小数。后面看了别人的思路才发现我们应该模拟小数除法的过程;在模拟的过程中如果某一次取得的余数,已经在前面出现过了那么就会在这里形成循环节;这个题目还有一点比较坑的就是输出格式,我就在这上面WA了好几发。代码如下:/*ID:15674811LANG:C++PROG:fracdec*/#include<iostream>#i原创 2015-04-09 21:51:48 · 604 阅读 · 0 评论 -
USACO--2.4Overfencing
思路还是比较简单的:只需要求出每个点到出口的最近距离,然后在去其中的最大值作为答案。这个题目麻烦在建图,我建图的时候是将每个点的4个方向的情况都处理出来,然后再进行bfs。其实也可以直接处理出相关点的连通性。然后就是这个题目有两个出口,但是我们只需要将他们一次入队,就可以求出每个点到出口的最近距离了,而不用进行两次bfs(其实也可以加一个源点连接着两个点,可以达到同样的效果)。代码如下:/*ID:原创 2015-04-09 18:02:54 · 550 阅读 · 0 评论 -
算法导论学习之快排+各种排序算法时间复杂度总结
快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小。一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地原创 2015-03-11 23:48:49 · 4683 阅读 · 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 · 884 阅读 · 0 评论 -
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 · 907 阅读 · 0 评论 -
USACO--2.4Cow Tours
题目大意:一个图被分成若干个连通块,我们可以选择在这些连通块中增加一条边,求加边以后所有点最小距离最大值最小的情况(有些绕口~)。 思路:最暴力的思路就是依次枚举需要连边的连通块然后再枚举这两个连通块中需要连接的定点,然后再用Floyd算出所有点的最小距离,然后再求最大值。这样时间复杂度是n^7,肯定会超时。仔细想一下我们其实并不关心我们枚举的边是属于哪个连通块的,我们只需要保证枚举的边不在同一个原创 2015-03-27 16:30:32 · 911 阅读 · 0 评论 -
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 · 713 阅读 · 0 评论 -
USACO--2.4The Tamworth Two
这题目一看就是一个模拟题,但是问题在于我们什么时候结束这次的模拟判断他们不可能相遇。开始的时候我想了几种可能循环的情况作为结束的判断条件,但都是超时;然后我想可不可设置一个时间上限来作为结束模拟的条件,然后我就设了一个上限100000,没想到AC了,后面我给改成1000还是可以AC。。。。。。。 后面看了一下官方的解答,我的思路是对的,但是上限设小了。考虑将一个格子的坐标加上站在这个格子中时面向的原创 2015-03-26 16:29:07 · 803 阅读 · 0 评论 -
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 · 725 阅读 · 0 评论 -
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 · 889 阅读 · 0 评论 -
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 · 767 阅读 · 0 评论 -
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 · 853 阅读 · 2 评论 -
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 · 792 阅读 · 0 评论 -
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 · 703 阅读 · 0 评论 -
USACO--1.2Name That Number
题意还是很简单的,我们可以用dfs穷举出所有可能的名字;重要的是查询名字是不是合法,开始的时候用的map,没想到超时了;于是后面用的字典树,其实应该也可以用二分进行查找。另外好像USACO对内存限制很严,数组不能开太大。代码如下:/*ID: 15674811LANG: C++TASK: namenum*/#include<iostream>#include<cstdio>#include原创 2015-03-07 15:09:06 · 719 阅读 · 0 评论 -
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 · 852 阅读 · 0 评论 -
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 · 729 阅读 · 0 评论 -
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 · 826 阅读 · 0 评论 -
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 · 793 阅读 · 0 评论 -
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 · 1076 阅读 · 0 评论 -
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 · 827 阅读 · 0 评论 -
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 · 516 阅读 · 0 评论