意甲冠军:我几乎不记得的题意!。!
它是一个长坑。。我们从根节点开始,留下每一步,保存横坐标1,正确的一步加上横坐标1。
那么同样的横坐标统计data值总和。
思维:我来想,这可以递归成就。上就能够算了。用一个数组来存各横坐标的data值,然后每来一个该横坐标的结点就直接加上就能够了。完了再遍历输出。
非常easy的,思路也非常清晰。本来以为能够一次过的,结果4次TLE+6次WA。
。
。简直破纪录了!
。開始TLE的原因是while死循环。由于我传的flag变量没用指针。一直不能break出循环。(本来还以为算法有问题呢,但认为这个递归应该能够吧。。为此还把MAXN由10000改成600改成90。
。才发现题目最后说一行最多80。。。)之后WA有多种原因,例子之间有空行,每一个例子中每一个数据间有空格可是最后一个数据没有空格,忘了凝视freopen,简直WA的原因大全了!
!最基本的还有最后一个找了好久才找到的原因是。開始我都是以scanf后跟的getchar来推断的。即dfs中凝视掉的那个if语句,即如果输入是-1且其后是EOF则输入结束。这里如果了-1后直接就结束。没有空格没有换行。。从拷贝例子数据时来看,-1后面的确像是那样,但题目总没有提到。。。
注意:结束行-1后可能有空格或换行,不是紧跟EOF
看了美网贝贝两盘胜A拉。好样的。希望再接再厉。娜姐不在的情况扛起大旗啊,近几年的代表作了吧
Code:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXN 90 typedef struct node { int data; int wz; struct node *left,*right; }Node; void print(); Node* dfs(int hz,bool *flag); Node* newnode(); void remove_tree(Node *root); int spwz[MAXN]; int first; int main() { //freopen("699.in","r",stdin); //freopen("699.out","w",stdout); int cnt=1; while(1) { memset(spwz,0,sizeof(spwz)); bool flag=0; first=1; Node *root=dfs(0,&flag); if(flag) break; printf("Case %d: ",cnt++); print(); remove_tree(root); } return 0; } void print() { int i=0; for(;i<MAXN;++i) { if(spwz[i]) { printf("%d",spwz[i]); break;} } for(i++;i<MAXN;++i) if(spwz[i]) printf(" %d",spwz[i]); printf(" "); } Node* dfs(int hz,bool *flag) { int num; scanf("%d",&num);//char c=getchar(); Node *u=newnode(); u->data=num; u->wz=hz; //if(x!=1 || (num==-1 && c==EOF)) {*flag=1; return NULL;} if(first && num==-1) {*flag=1; return NULL;} first=0; if(num<0) return NULL; if(num>0) { spwz[MAXN/2+hz]+=num; u->left=dfs(hz-1,flag); u->right=dfs(hz+1,flag); return u; } } Node* newnode() { Node *u=(Node*)malloc(sizeof(Node)); if(u!=NULL) { u->data=u->wz=0; u->left=u->right=NULL; } return u; } void remove_tree(Node *root) { if(root!=NULL) { remove_tree(root->left); remove_tree(root->right); free(root); } }
版权声明:本文博客原创文章。博客,未经同意,不得转载。