随笔分类 - USACO
摘要:Frame UpConsider the following five picture frames shown on an 9 x 8 array:........ ........ ........ ........ .CCC....EEEEEE.. ........ ........ ..BBBB.. .C.C....E....E.. DDDDDD.. ........ ..B..B.. .C.C....E....E.. D....D.. ........ ..B..B.. .CCC....E....E.. D....D...
阅读全文
摘要:nocow上的分析,发现这规律的人实在是太厉害了,bfs或者dfs还没试过,照着这思路写最后还是有点问题,1,2时有点特殊,看了下别人的代码过了数据分析Usaco在这题上并没有指明不可以用分析法,而且dfs肯定TLE,所以我们取巧。先观察样例数据,如果把还没移动的那一步也算上,那么空格的位置为4 3 5 6 4 2 1 3 5 7 6 4 2 3 5 4 (n=3,样例)5 4 6 7 5 3 2 4 6 8 9 7 5 3 1 2 4 6 8 7 5 3 4 6 5 (n=4)我们凭借极其敏锐的眼光发现这组序列为435 642 1357 642 35 4 (n=3,样例)5 46 753 2
阅读全文
摘要:这题比较简单,用点STL写起来很方便,搞清楚题意就好,最好是先对dict读出来处理下,符合规则的存到map里,map不懂看下NOCOW。wa了2次,发现是忘了处理只判断一个字符串的情况/*ID: hubiao cavePROG: lgameLANG: C++*/#include#include#include#include#include#includeusing namespace std;#define VALUE(x) (value[x-'a'])map ms;list >lp;const int value[26]={2,5,4,4,1,6,5,5,1,7,6,
阅读全文
摘要:涉及到的图的题目不会,贴个别人代码先过了,晕,这几天真是烦死了。/*ID: hubiao cavePROG: prime3LANG: C++*/#include #include #include #include using namespace std;const int MAX = 99999;const int DIV[6] = {0,10000, 1000, 100, 10, 1};bool primes[MAX];int n, sum;int prime1[10][1000][6];int nprime1[10];int prime3[10][1000][6];int nprime3
阅读全文
摘要:题解说是最速下降问题,表示还没做到过,dp方程很好理解,关键是要求数量和同时不能重复,NOCOW上的方法是对于第二问求最长下降序列的数量,可以通过求第一问的过程解决。设MaxCnt[i]为第i项为末尾中最长下降序列的个数。对于所有的j(1≤j≤i-1)如果有(s[j]>s[i] 并且 MaxLength[j]+1>MaxLength[i])则MaxCnt[i]=MaxCnt[j],否则如果(MaxLength[j]+1= =MaxLength[i])可利用加法原理,MaxCnt[i]=MaxCnt[i]+MaxCnt[j]。考虑到题目中说的不能又重复的序列,我们可以增加一个域Nex
阅读全文
摘要:题意:A,B两种机器数量m,n,且知道每个机器加工一件产品的用时,B机器加工的产品必须要A先加工过的,那么求s个产品,所需的A,B最加工完成的时间。A的时间比较好求,每次选择开始时间+加工时间最小的,然后当前开始时间增加。用priority_queue比较方便实现,同时按产品加工完先后顺序记录时间acost[s];B的比较巧妙,同样按A的方法得到bcost[s],然后反过来求bcost[s-i+1]+acost[i]的最大值即时最快完成B的时间。这个好好理解下。/*ID: hubiao cavePROG: jobLANG: C++*/#include#include#include#inclu
阅读全文
摘要:第一次遇到这种题,属于什么类型的都没看明白...然后自己用贪心写,不知是USACO数据有点弱还是咋样,前面8个差不多都是秒过,仅是最后一个和答案相差1,结果我以为自己的解法没错,可能只是边界数据没处理好,调了半天,后来想想可能是我的解法比较碰巧,前面8个都能过...网上查,才明白这是一类问题,有很明确的解法,这里可以用比较简单的匈牙利算法,写起来很简单,但是我还没彻底理解清楚,涉及到二分图,增广路径这几个概念,可以参考下百度百科的匈牙利算法看看这里我贴上我开始错误的贪心,和模仿别人写的匈牙利。 1 /* 2 3 ID: hubiao cave 4 5 PROG: stall4 6 7 L...
阅读全文
摘要:算法导论求最大流这一节还没看过,下午看了下,参照了大牛的代码模仿写了Ford-Fulkerson+BFS过了... 1 /* 2 3 ID: hubiao cave 4 5 PROG: ditch 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include 15 16 #include 17 18 #include 19 #include 20 #include 21 22 using namespace std; 23 24 25 26 int E[201][201]; 27 int m,n; 28 bool vis...
阅读全文
摘要:题目越来越难了,我已经不抱希望自己能完全做出来了,先好好学习下大牛的题解吧。这题我按照题解提示搜索+剪枝的,全部都用上了,还是在case 9 tle了,对比下大牛的代码,感觉自己的写还是太繁琐,好多判断不需要或者完全可以归并到一种情况。最后是跟着改改勉强过了贴两个对比下。 1 /* 2 3 ID: hubiao cave 4 5 PROG: cryptcow 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include 15 #include 16 #include 17 #include 18 using namespace st...
阅读全文
摘要:昨天头疼,眼涨,又想吐,感觉人都要死了,晚上六点实在扛不住了跑去床上睡到第二天早上七点才感觉好些了。一天啥都没干现在补一点,这题还是没做出来,以前dfs是遍历点,这里是要找到环,开始写发现不对,出来的不一定是环,后来看大牛的题解通过记录边的相对位置确实比较厉害,比如abc3条边相连,a在b里的记录方向是1,b在a的记录方向是1,c在b里的记录方向是2在a的记录里找到b,从b开始dfs时,dfs(b,b.dir[a]),到b这一层后只要判断 b.dir[c]!=b.dir[a]可找到c,我说的可能不太清楚,看下代码里的dfs就懂了/*ID: hubiao cavePROG: fence6LANG
阅读全文
摘要:额,开始感觉有点像多重背包的问题,但是背包太多了,要是几个背包估计还能用多维背包过去。后来想着朴素dfs,然后果然如题解所说,只能过3个,后面就太慢了。NOCOW说用DFSID,这个表示没听说过,于是找了下相关记录http://enc.tfode.com/DFSID这是一个解释,字面意思就是深度迭代的dfs,不过又说是bfs+dfs,有点搞不清楚了...看了看NOCOW上大牛的题解,大概明白了点,好像就是在dfs里添加一个深度限制,能到达这个限制就判断这次dfs成功。可是光这样还是过不去,后面又看到提出二分搜索的优化,由于肯定开始要把rails和broads排序,而且坑定先从小的几个rails
阅读全文
摘要:4章第一题就跪..数论先不说,先说背包,大概意思简化为,n个数,无限取用,给你个组合上限,找到最大的不能组合的数。开始还是有点迷惑,没看懂,后来一想貌似就是完全背包啊...还没有完全背包的那个例子复杂...再说数论,一个开始题目里用到这样的例子, abc 3个数,ab的最大公约=m, mc的最大公约=1,证abc最大公约数=1其实这题可以转为证明ab的最大公约数是否一定能整出其他公约数,假设abc存在非0公约数d,那么d15 #include16 #include17 #include18 19 using namespace std;20 21 22 int gcd(int,int);23
阅读全文
摘要:感觉还是类似01背包,相比于01背包直接f[i][w]=max(f[i-1][w],f[i-1][w-w[i]]+value[i]);这个的最后一个要根据当前总容量是否能整出t,是否剩余的部分>=t分情况下,开始忘了在else时f[i][j]=f[i][j-1]呢,还是不熟练啊,循环开始就该写了我的1次ac啊.... 1 /* 2 3 ID: hubiao cave 4 5 PROG: rockers 6 7 LANG: C++ 8 9 */10 11 12 13 14 #include15 16 #include17 18 #include19 20 using namespace .
阅读全文
摘要:这题...额 我就是模拟着一条一条数完为止,4种情况,模拟过了,没想到到了第三章还有这么简单的题 1 /* 2 3 ID: hubiao cave 4 5 PROG: fence9 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 main() 25 26 { 27 28 ifstream fin("fence9.in"); 29 30 ofs...
阅读全文
摘要:就是根据二叉树的中序,前序,求后序,我想法是先求出二叉树再后序出来。开始感觉想起来很混乱,后来拿笔在纸上写一写就清楚很多了这题不是很难,思路要清晰即可 1 /* 2 3 ID: hubiao cave 4 5 PROG: heritage 6 7 LANG: C++ 8 9 */10 11 12 13 14 #include15 16 #include17 18 #include19 20 using namespace std;21 22 23 string prestr,midstr;24 25 struct node26 {27 char m;28 node* l...
阅读全文
摘要:描述一个闭合的栅栏是平面上的一些不相交的首尾相连的线段形成的多边形,有N个角(顶点) (3 #includeusing namespace std;ofstream fout ("fence4.out",ios::out);ifstream fin ("fence4.in",ios::in);const double JD = 0.005;struct Point{ double x,y;}point[201],see;struct Line{ Point start,end;}line[201];long n,len=0;bool cansee[201
阅读全文
摘要:这题我是完全不知道从何下手,何为当前最优,而且第二个人也要是最优考虑。题解给的dp,状态方程 dp[i][j]=sum[i][j]-min(dp[i+1][j],do[i][j-1]);sum[i][j]表示i到j总价值 dp[i][j]表示从i 到j里先选注意是先选人所能够获得的最优。感觉比较巧妙,值得mark下 1 /* 2 3 ID: hubiao cave 4 5 PROG: game1 6 7 LANG: C++ 8 9 */10 11 12 13 14 #include15 16 #include17 18 #include19 20 using namespace std...
阅读全文
摘要:直接搜肯定过不去,后来看到题解别人按他的思路搜索无剪枝也能过,试了下结果还是不行,不过思路倒是不错,每个点若2x2满足要看3x3只用看额外加入的一行一列。官方题解好像是dp,状态方程 dp[i][j]=min(dp[i+1][j],dp[i][j+1],dp[i+1][j+1])+1;G[i+1][j] , G[i][j+1] , G[i+1][j+1]分别为(i,j)向下、向右、向右下一格的状况。 在(n-1,n-1)当且仅当三者都为1的时候,正方形才能扩充。从最右下向上,依次扩充即可按照这个思路写了个 1 /* 2 3 ID: hubiao cave 4 5 PROG: ra...
阅读全文
摘要:好烦的一题,思路不是很难,bfs,数据结构要定义好,写起来各种问题,看nocow题解,照某个敲,到case20就是不过。我擦,后来我直接把他代码复制过去都过不了。找了个别人的先过了... 1 /* 2 3 ID: hubiao cave 4 5 PROG: camelot 6 7 LANG: C++ 8 9 */10 11 #include 12 #include 13 #include14 15 using namespace std;16 17 struct data{18 int x,y,d;19 }q[10000];20 21 bool use[40][40...
阅读全文
摘要:这题能做对我都不信,开始想了好久感觉确实类似完全背包,dp表不好定义,完全背包一维数组就完了,这里最多要买5种商品于是去看了眼题解,就看到dp两字和一个5维数组....我去,真有5维数组这种东西...不过一想确实可以啊,虽然麻烦点。不过一样是完全背包的思想。dp[5][5][5][5][5],有点区别是完全背包原题是求最大价值,状态方程是dp[n]=max(dp[n],dp[n-weight(m)]+value(m));且初始dp[1]到dp[n]为0这里要求最小,就要反过来一下初始时dp[a][b][c][d][e] (a-e分别代表对应位置的商品的个数)要=a*price(1)+b*pri
阅读全文

浙公网安备 33010602011771号