首页 > 代码库 > UVa 699 落叶
UVa 699 落叶
题意:题意我都快记不清了!!!被坑好久。。就是从根结点开始,每往左走一步,横坐标减1,往右走一步横坐标加1。然后统计同一横坐标下的data值之和。
思路:这个我特地先想了能不能用递归建树的,后来发现在建树过程中其实就可以算了。用一个数组来存各横坐标的data值,然后每来一个该横坐标的结点就直接加上就可以了,完了再遍历输出。
很简单的,思路也很清晰。本来以为可以一次过的,结果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:\n",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("\n\n"); } Node* dfs(int hz,bool *flag) { int num; scanf("%d",&num);//char c=getchar(); Node *u=newnode(); u->data=http://www.mamicode.com/num;>UVa 699 落叶
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。