• UVa 699 落叶


    意甲冠军:我几乎不记得的题意!。!

    它是一个长坑。。我们从根节点开始,留下每一步,保存横坐标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);             
     }    
    }

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    巧用数据流让 Word 文档在线阅读
    《开源公开课分享》:Java开源框架案例分享
    存储过程
    opencv求取RGB分量
    opencv中的矩阵操作
    三维高斯模型 opencv实现
    线性均值滤波和中值滤波的比较
    opencv 画延长线
    MATLAB曲线绘制
    如何在博客园发博客时插入优酷视频
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4719293.html
Copyright © 2020-2023  润新知