摘要: //又是DFS,其实就是建树然后一边建一般判读,但是很多这种题都不一定真刀真枪地//把建树语句写出来,只要是这种思路即可,这样就可以减少时间#include <stdio.h>int ok;int dfs(){ int w1,d1,w2,d2; scanf("%d%d%d%d",&w1,&d1,&w2,&d2); if(w1 && w2 && d1 && d2) { if( (w1*d1) != (w2*d2) ) {ok=0; return 0;} else return (w1+ 阅读全文
posted @ 2012-10-05 22:54 Titanium 阅读(645) 评论(0) 推荐(0) 编辑
摘要: //思路:一遍输入扩展前序一遍建树,在建树过程中记录该结点的水平坐标,根结点的坐标为0,往左减1,往右加1,最后会的到一个最左侧坐标L,最右侧坐标R建树之后见遍历、,遍历过程中,统计各个坐标的值并求他们的和保存在数组中,但是左侧的坐标是负值,数组没有负值,所以开一个二维数组sum[2][MAX],第一行对应右侧的坐标,从1到R,第二行对应左侧的坐标,从1到-L,也就是将左侧的坐标在统计时取绝对值,然后累加求和.思考可知建树和遍历的过程实际上相同所以干脆把遍历去掉,直接建树,建树过程中就求水平坐标并累计求和//注意输出的格式,时间也不太好,0.100上下#include <stdio.h& 阅读全文
posted @ 2012-10-05 22:52 Titanium 阅读(250) 评论(0) 推荐(0) 编辑
摘要: //提交通过,0.092,不算太快,先给出代码#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 10010#define INF 100000010struct treenode{ int data,lchild,rchild,level;};int *start,*flag;int min,leaf,pre,value;int input(int *post , int *ind){ int i,len; char ch; i=0; while(1) { if(... 阅读全文
posted @ 2012-10-05 22:51 Titanium 阅读(657) 评论(0) 推荐(0) 编辑
摘要: //难得的1Y,完全水过去,硬生生地把式子搞出来,代码写得很差,但是数据较小而且判断//较多所以省去不少时间#include <stdio.h>#include <string.h>#include <algorithm>#define MAX 150using namespace std;char string[150],temp[150];struct elemt{ char ch; int data; int flag;}a[MAX]; //flag=0表示这个元素在运算结束之后不需要变化,1表示运算后加1,-1表示运算后减1,所以同意+flag即可i 阅读全文
posted @ 2012-10-05 22:50 Titanium 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 这道题最难的地方是怎么计算最后的结果,建树不难,就按照前序建树即可,DFS遍历也不难,要算出每棵是中黑色像素也不难,但问题是怎么确定最后的结果//一下代码可以建树,可以DFS遍历,可以计算每棵树的黑点个数,但不能解出//本题,要做出一些改动//提交通过,时间不错,在0.008到0.020之间#include <stdio.h>#include <string.h>#include <stdlib.h>#define LEN sizeof(struct tree)int weight[7]={0,1024,256,64,16,4,1};struct tree{ 阅读全文
posted @ 2012-10-05 22:48 Titanium 阅读(410) 评论(0) 推荐(0) 编辑
摘要: 将原来的代码改了一个BUG即是存在负数后就AC了,但是时间不好,0.112实际上本题就是由扩展前序序列来建树,然后遍历,算路径的题目,考查了二叉树的基本知识,很好#include <stdio.h>#include <string.h>#include <stdlib.h>#define LEN sizeof(struct BTree)#define MAX 10010char num[MAX][20],stack[MAX];struct BTree{ int data; struct BTree *lchild,*rchild;}*pre;int top, 阅读全文
posted @ 2012-10-05 22:47 Titanium 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 算法分析:构建表达树后可以发现,用栈实现逆波兰表达式其实是用后序遍历的方式来输入树的所有结点,如果用队列实现是用层序遍历的方式来输出所有结点,所以本题可以转化为已知后序遍历的序列然后构树再用层次遍历的方式输出要构建二叉树至少知道两个遍历序列,或者设法构建扩展二叉树显然该题由小写字母就可以知道是树的根结点,可以构建成为扩展二叉树,至此,建树成功,即可层序遍历的方式输出结点(先在输入时将遍历序列变成扩展遍历序列)2xyPzwIM ##x##yP##z##wIMabcABdefgCDEF ##a##b##cAB##d##e##f##gCDEF//然后由扩展后序遍历序列来构建二叉树,然后用层序遍历的方 阅读全文
posted @ 2012-10-05 22:45 Titanium 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 大意是:判断一个玩具内能否容下其它小玩具,当且仅当其它玩具尺寸之和小于外层玩具时输出Matrioshka//1Y的代码,很好,其实就是模拟一下,注意一下细节#include <stdio.h>#include <string.h>#define MAX 10010struct node{ int size,volume;};struct node a[MAX],temp[MAX];int n,top,outside;int JUDGE(){ int i; memset(a , 0 ,sizeof(a)); // printf("test a volume\n& 阅读全文
posted @ 2012-10-05 22:41 Titanium 阅读(295) 评论(0) 推荐(0) 编辑
摘要: //非常好的算法,代码很短,20来行就可以,时间也不差0.060,但是考虑是否可以更快//这个算法用到了“相对位置”的思想,并且就本题而言还有一个很重要的结论就是,假设//移动了k个元素,那么这k个元素一定是最后结果的那个序列的前k个元素,而且易知,//越先移动的元素一定会越被压在移动的元素的底部#include <stdio.h>#include <string.h>char name[210][100],standard[210][100];int main(){ int T,i,j,n; scanf("%d",&T); while(T- 阅读全文
posted @ 2012-10-05 22:36 Titanium 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 算法描述:开辟一个日期数组,清空为0,以1来标记当天已经有活动,不用再添加,每次从0变为1就计数一次。另外做一个预处理,将所有的周五和周六标记为1,但不能计数,没得到一个h,就调用函数在日期数组中搜索判断。判断所有h的倍数,如果为0,则计数并变为1#include <stdio.h>#include <string.h>#define MAX 3660bool date[MAX];int count,N;void manage(){ int i; memset( date , 0 , sizeof(date) ); for(i=7; i<=N+1; i+=7) d 阅读全文
posted @ 2012-10-05 22:33 Titanium 阅读(171) 评论(0) 推荐(0) 编辑