ACM 树的递归 Not so Mobile & The Falling Leaves

àì夳堔傛蜴生んèń 2022-06-12 05:56 209阅读 0赞

滴,集训第一天打卡。

今天是紫书第六章训练+STL的运用。

STL的就不放啦~这里有2道表面是建树,其实是递归(不必要建树)的题讲一下。

(哇,刷新了我对递归的认识..感觉超级厉害的!)

UVA 839 Not so Mobile

20170717160151470

20170717160231521

题目大意:给你一个杠杆两端的物体的质量和力臂,如果质量为零,则下面是一个杠杆,判断是否所有杠杆平衡。

  1. #include<iostream>
  2. using namespace std;
  3. bool solve(int& W)
  4. {
  5. int W1,D1,W2,D2;
  6. bool b1=true,b2=true;
  7. cin>>W1>>D1>>W2>>D2;
  8. if(!W1)
  9. b1=solve(W1);
  10. if(!W2)
  11. b2=solve(W2);
  12. W=W1+W2;
  13. return b1&&b2&&(W1*D1==W2*D2);
  14. }
  15. int main()
  16. {
  17. int T,W;
  18. cin>>T;
  19. while(T--)
  20. {
  21. if(solve(W))
  22. cout<<"YES"<<endl;
  23. else
  24. cout<<"NO"<<endl;
  25. if(T)
  26. cout<<endl;
  27. }
  28. return 0;
  29. }

UVA 699 The Falling Leaves

20170717162603771

20170717162700590

题目大意:给定一棵树,从左到右计算竖着的权值合,例如图就是7,5+6,3

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. const int maxNum = 1005;
  5. int sum[maxNum];
  6. void build(int pos)
  7. {// 输入并统计子树,水平位置为pos
  8. int v;
  9. cin >> v;
  10. if(v == -1) return;// 空树结点
  11. sum[pos] += v;
  12. build(pos - 1);
  13. build(pos + 1);
  14. }
  15. bool init()
  16. {// 输入并初始化树根,再构建子树
  17. int v;
  18. cin >> v;
  19. if(v == -1) return false;
  20. memset(sum, 0, sizeof(sum));
  21. int pos = maxNum / 2; // 树根的水平位置
  22. sum[pos] = v;
  23. build(pos - 1);// 构建左子树堆
  24. build(pos + 1);// 构建右子树堆
  25. return true;
  26. }
  27. int main()
  28. {
  29. int kase=0;
  30. while(init())
  31. {
  32. int p=0;
  33. while(sum[p]==0)
  34. p++;
  35. cout << "Case " << ++kase << ":\n" << sum[p++];
  36. while(sum[p]!= 0)
  37. cout << " " << sum[p++];
  38. cout << "\n\n";
  39. }
  40. return 0;
  41. }

再贴一个学姐的代码~

  1. #include<stdio.h>
  2. #include<string.h>
  3. int a[200];
  4. void f(int y)
  5. {
  6. int x;
  7. scanf("%d",&x);
  8. if(x==-1)return;
  9. a[y]+=x;
  10. f(y-1),f(y+1);
  11. }
  12. int main()
  13. {
  14. int n,k,x,l=0,i;
  15. while(scanf("%d",&x),x!=-1)
  16. {
  17. k=0;
  18. memset(a,0,sizeof(a));
  19. a[100]=x;
  20. f(99),f(101);
  21. printf("Case %d:\n",++l);
  22. for(i=0;i<200;i++)
  23. {
  24. if(a[i]!=0)
  25. {
  26. if(k)printf(" ");
  27. printf("%d",a[i]);
  28. k=1;
  29. }
  30. }
  31. puts("\n");
  32. }
  33. }

发表评论

表情:
评论列表 (有 0 条评论,209人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ORACLE

    connect\_by\_isleaf connect\_by\_isleaf函数,用来判断当前节点是否包含下级节点,如果包含的话,说明不是叶子节点,这里返回0;反之,如