码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 699 落叶

时间:2014-08-28 03:14:08      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:uva   递归   落叶   

题意:题意我都快记不清了!!!被坑好久。。就是从根结点开始,每往左走一步,横坐标减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=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);             
 }    
}

UVa 699 落叶

标签:uva   递归   落叶   

原文地址:http://blog.csdn.net/buxizhizhou530/article/details/38889613

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!