UVa OJ 839

本文探讨了在算法竞赛中面对复杂代码时的挑战,并分享了解决方法。作者通过实例说明了理解题意的重要性,以及如何通过清晰的代码结构提高程序正确率。文章还强调了代码复杂度与错误率之间的关系,提供了实用的编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、感觉《算法竞赛入门经典》的书后习题还真不是很好做。。。

2、这道题我理解错了题意,所谓“天平平衡”应该是指每个“子天平”也要平衡,我开始忽略了这一点,改后AC。

3、发现代码写得越复杂越容易出错,思路清晰、结构分明的代码更容易AC。

#include<cstdio>
#include<cstdlib>
using namespace std;
typedef struct Tnode{
    int wl,dl,wr,dr;
    struct Tnode *left,*right;
}Node;
int a,b,c,d;
bool judge;
Node *newnode(){
    Node*u=(Node*)malloc(sizeof(Node));
    if(u!=NULL){
       u->left=u->right=NULL;
    }
    return u;
}
void addnode(Node*u){
    if(u->wl==0){
        if(scanf("%d%d%d%d",&a,&b,&c,&d)==4){
        Node*v1=newnode();
        v1->wl=a;v1->dl=b;v1->wr=c;v1->dr=d;
        u->left=v1;
        addnode(v1);
        }
    }
    if(u->wr==0){
        if(scanf("%d%d%d%d",&a,&b,&c,&d)==4){
        Node*v2=newnode();
        v2->wl=a;v2->dl=b;v2->wr=c;v2->dr=d;
        u->right=v2;
        addnode(v2);
        }
    }
    return;
}
void remove(Node*u){
     if(u==NULL) return;
     remove(u->left);
     remove(u->right);
     free(u);
}
int calculate(Node*temp){
    int lsum=0,rsum=0;
    if(temp->left==NULL)
        lsum=temp->wl;
    else if(temp->left!=NULL)
        lsum=calculate(temp->left);
    if(lsum<0) return -1;
    if(temp->right==NULL)
        rsum=temp->wr;
    else if(temp->right!=NULL)
        rsum=calculate(temp->right);
    if(rsum<0) return -1;
    if(lsum*temp->dl==rsum*temp->dr)
        return lsum+rsum;
    else{
        judge=false;
        return -1;
    }
}
int main(){
   //freopen("a.txt","r",stdin);
   int T,lsum,rsum;
   Node*root;
   bool flag=false;
   scanf("%d",&T);
   while(T--){
      if(flag) printf("\n");
      scanf("%d%d%d%d",&a,&b,&c,&d);
      root=newnode();
      root->wl=a;root->dl=b;root->wr=c;root->dr=d;
      addnode(root);
      lsum=0;rsum=0;
      if(root->left!=NULL){
          lsum=calculate(root->left);
      }
      if(root->right!=NULL){
          rsum=calculate(root->right);
      }
      if(calculate(root)!=-1)
          printf("YES\n");
      else
          printf("NO\n");
      flag=true;
      remove(root);
   }
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值