随笔分类 - USACO
摘要:额,我是直接dfs的思路,但是到case 5过不去了,感觉是太慢了。然后网上看题解,题目原型就是欧拉路径,欧拉路径存在的条件是 要么点的度都是偶数,要么只有两个点的度是奇数。如果是两个点的度是奇数,起点和终点一定是这两个点,然后我就加了一个判断,如果是有奇数度的点,取较小的点作为起点dfs。dfs写的很丑,没组织好,还根据初始点判断,其实组织好没有这么麻烦...但是到7还是过不去,继续看题解,发现有个大牛dfs同时加了个floodfill其实我一直以为floodfill就是dfs和bfs...然后我仿照加了个勉强过了 1 /* 2 3 ID: hubiao cave 4 5 PR...
阅读全文
摘要:用n次djikstra 求最小和的思路,关键是如何优化,开始直接用数组存,case8 就过不去了,后来把extract-min换成priority_queue 到case9还是没过去。先贴个我的 ,在贴个大牛的/*ID: hubiao cavePROG: butterLANG: C++*/#include#include#include#includeusing namespace std;#define INFINITE 888888int N,P,C;int djistra(int origial);int visit[801];int counter[801];int pastures[
阅读全文
摘要:容易想到bfs,然后是根据重复剪枝,问题是如何判重复,若把每次访问过的字符串看成数作为index,最大有87654321,而实际只有8!阶乘个数,大致40000多点。这里要用到康托展开应用实例{1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。代表的数字 1 2 3 4 5 6 也就是把10进制数与一个排列对应起来。他们间的对应关系可由康托展开来找到。如我想知道321是{1,2,3}中第几个小的数可以这样考虑 :第一位是3,当第一位的数小于3时,那排列数小于321 如 123、 213 ,小
阅读全文
摘要:只能说是看着题解做的,题目模拟可以过,但是题意有点模糊不清,缺口如[1,2]表示缺口1和2,而不是1到2之间的1个还有宽度如包括收尾,比如start=0,length=30,则最后包括0-30共31个缺口... 1 /* 2 3 ID: hubiao cave 4 5 PROG: spin 6 7 LANG: C++ 8 9 */10 11 #include12 #include13 #include14 using namespace std;15 16 int main()17 18 {19 ifstream fin("spin.in");20 ofstream f..
阅读全文
摘要:跪跪跪,第三章没做几题,已经连跪几天了.好桑心,不过能咋办,不会就看别人的学啊.同样是暴力搜,别人的剪枝实在是不能太叼. 1 /* 2 3 ID: hubiao cave 4 5 PROG: kimbits 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include 15 16 #include 17 18 #include 19 20 using namespace std; 21 22 23 24 int GetOne(int); 25 unsigned int N,L,num; 26 int main() 27...
阅读全文
摘要:求阶乘的最后一位非零整数。开始天真无鞋,以为只取最后非零位累成即可.然后自然出错官方解释,可能存在xx12*xxx5,如果只取最后非零位累乘...2*5=10 mode 10 ==1 ,这样两个数十位上的就被忽略了...大概是这个意思。然后解题思路是,10全部是由2*5产生的,即使是10本身也是2*5,所以只要去掉累乘中的所有2,5对就好了而2出现的概率远大于5,用数组arry[n]保存1到n,然后每个数mod5 直到因子5全部被剔除 ,同时记录剔除的个数m,然后再对更新后的arry[n]剔除m个2(记住除多除少了)这样就不会产生10了.在取最后一位累乘即可. 看似简单,本菜真想不出来了 1
阅读全文
摘要:以前遇到dp,直接看题解然后再花一下午看懂(虽然还是似懂非懂)今天遇到dp,依旧是直接看状态转移方程..但好歹自己能写出来了... 1 /* 2 3 ID: hubiao cave 4 5 PROG: stamps 6 7 LANG: C++ 8 9 */10 11 12 13 14 #include15 16 #include17 18 #include19 #include20 21 using namespace std;22 23 24 25 int K,N;26 int mins[200*10000+1];27 int stamp[52];28 int main()29 30...
阅读全文
摘要:这题好烦了,看着蛮简单,开始用map存,最后排序要用到value值,但map的compare只传key...换成set >勉强能跑但是好慢,后来看题解最后直接把map里的传到vector>再排序,我怎么就没想到多用个容器...不想写了贴个别人的过了先,不过有点注意,算起点时我这么些j=0;jstr.length()时,循环应该自动退出.结果却不是.后来看提示才明白,str.length()返回的是unsigned int,我的A是int而当unsigned int和int运算时,结果作为unsiged...那自然是j一直小于...然后又是vector不能用于copy... 1 /*
阅读全文
摘要:这题不会,直接的看的题解,方法很多,不过感觉都没见过啊,选了第一个漂浮法看了好久才搞懂漂浮法以逆序来进行放置,即n to 1。逆序的好处在于放置一个矩形后,俯视看到的就是最终俯视该矩形应该看到的。因为挡着它的矩形在之前已经放置好了,所以可直接统计,为递归创造了条件。每放一个矩形,可以想象成将其扔入一密度很大的海水底部,海分成了n层,然后矩形开始向上浮。在上浮过程中若碰撞到其他的矩形则断裂成几个小矩形,继续上浮,直到浮出水面。于是想到用个递归来模拟上浮过程。 解释下,就是倒过来放,先放最上面一个,因为水面无拦截的矩形,直接飘到水面,被看到全部-----对应最后画的矩形肯定没有被覆盖然后是倒数第二
阅读全文
摘要:...目测我自己写坑定超时,就去NOCOW看了下,题解,官方是每个质数与已有的humble想乘取大于最大humble的最小数即是新的最大humble,然后我就写了个个,开始嫌麻烦用set存,超时的飞起。然后全部改成数组,结果case 6还是超时,想了半天感觉和别人的题解也没啥差别,为什么运行时间差这么多后来试着把69行的循环初始条件改成i=0,改成i=1,瞬间过了....后来一想确实i=0 没用啊,而且case 6求第100000个,白白循环100000次.... 1 /* 2 3 ID: hubiao cave 4 5 PROG: humble 6 7 LANG: C++ 8 9 *...
阅读全文
摘要:完全背包足以,参照完全背包最优解就过了/*ID: hubiao cavePROG: inflateLANG: C++*/#include#include#include#includeusing namespace std;int main(){ ifstream fin("inflate.in"); ofstream fout("inflate.out"); int f[10003]; int w[10003]; int v[10003]; int num,minute; fin>>minute>>num; for(int i=
阅读全文
摘要:用的kruskal求最小生成树,开始想着用一维数组 判断是否存在环,后来一想不对,可能每个点都放连到,但是路径之间不连通...还是得换二维,再就是set里判断元素相等是根据A 15 16 #include 17 #include 18 #include 19 20 #include 21 #include 22 using namespace std; 23 24 #define MAX 888888 25 26 struct node 27 { 28 int w; 29 pair p; 30 }; 31 32 bool operator sn; 46 47 ...
阅读全文
摘要:从chapte1到chapter2历时1个月,虽然短短30多题,但我已跪了10+题以上...太惨了,今天奋战chapter2最终战,在预先看了解题思路的情况下还是跪倒了.最后是看了下这篇解题报告http://blog.csdn.net/supersnow0622/article/details/9765255仿照着勉强写了一遍,努力啊少年/* ID:hubiao cave LANG:C++ TASK:fracdec */#include#include#include#includeusing namespace std;int main(){// int b[100000]; string
阅读全文
摘要:前面写好久就是过不了,后面完全没看懂意思,贴了nocow代码过了先,mark下
阅读全文
摘要:第一次用dijkstra做题,思路很清晰,但是写完发现竟然有130行...调试都调了好一会看了看别人同是用dijkstra做,不到50行,压力山大,看来以后做对了也得看看别人的题解 1 /* 2 3 ID: hubiao cave 4 5 PROG: comehome 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include 15 16 #include 17 18 #include 19 #include 20 21 #define MAX 999999; 22 23 24 using namespace std; ...
阅读全文
摘要:走迷宫让我想起数据结构的课设,不过是反过来找到出口的最短路径,方法差不多,用的bfs,想法是从bfs找到每个点的最短路径,其中最长的就是最难到出口的.不过这图确实让我比较蛋疼,开始以为一个符号算一格,定义的迷宫长宽为2h+1,2w+1...后来一跑发现是17,和例子的9差这么多...仔细一看原来迷宫还是h*w大小的...后来来想着怎么改进存储,想了好一会发现改起来还真麻烦,后来脑子一转,我无非多走了1倍,于是把结果(tmax+1)/2竟然过了...有点要注意,bfs时遇到第一次访问的点时,存进去当前已走步数,如果再次访问到,若发现第二次步数小于已存的,则替换为更小的,同时入队列.反之不入列。对
阅读全文
摘要:思路比较清楚,模拟+判断重复,定义好表示方式用位运算判重。如何判重即是判断是否能相遇,记录每分钟时人和牛所在位置与行走方向,如果到某分钟时发现当前位置和方向已被记录过,则说明陷入循环及永不会再相遇 1 /* 2 3 ID: hubiao cave 4 5 PROG: ttwo 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include 15 16 #include 17 18 #include 19 20 using namespace std; 21 22 23 int field[12][12]; 24 int re...
阅读全文
摘要:dfs搞了半天硬是没过,看了别人的题解我感觉却更加迷惑了.. 1 /* 2 3 ID: hubiao cave 4 5 PROG: concom 6 7 LANG: C++ 8 9 */10 11 12 #include 13 #include 14 #include 15 #include 16 using namespace std; 17 int have[101][101]; 18 int control[101][101]; 19 int main() { 20 ofstream fout ("concom.out"); 21 ifst...
阅读全文
摘要:dpdp始终是让我头疼,开始看着像背包问题,想了会列个状态方程 dp[n]=dp[n]+dp[money[i]];后来一看不对应该是dp[n]=dp[n]+dp[n-money[i]];看来01背包问题还是没搞清楚,后的循环也有问题,我开始的外循环是总钱数,里循环才是硬币种类,应该反过来. 1 /* 2 3 ID: hubiao cave 4 5 PROG: money 6 7 LANG: C++ 8 9 */10 11 12 13 14 #include15 16 #include17 18 #include19 20 using namespace std;21 22 23 24...
阅读全文
摘要:dfs枚举过,完全没有剪枝,最后的个求sum函数倒是有点麻烦 1 /* 2 3 ID: hubiao cave 4 5 PROG: zerosum 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include 15 16 #include 17 18 #include 19 20 #include 21 using namespace std; 22 23 24 set >ss; 25 26 char ch[3]={' ','+','-'}; 27 28 29 30 void dfs(int); 31 bool.
阅读全文

浙公网安备 33010602011771号