两题类似,所以放在一起了。
839
题目大意: 判断天平是否平衡。
思路:按前序遍历的顺序建树,在建树的同时可以判断是否平衡。
代码:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <set>
using namespace std;
int flag = 1;
int pre()
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
int lw = a,rw = c;
if(a == 0) lw = pre();
if(c == 0) rw = pre();
if(lw * b != rw * d)
flag = 0;
return lw+rw;
}
int t;
int main()
{
scanf("%d",&t);
int num = 0;
while(t--)
{
flag = 1;
pre();
if(num != 0)
printf("\n");
num++;
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
Uva699
题目大意: 下落的树叶,根结点到左右两遍的距离都是1,计算地上的不同的堆的落叶数量。
思路:和上一题类似,这题也是前序遍历建树,而且由于距离都是1,所以在建树的时候所属的位置就已经定了。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
#define maxn 1005
int ans[maxn];
int build(int dis)
{
int a;
scanf("%d",&a);
//cout<<dis<<endl;
if(a == -1) return -1;
ans[dis] += a;
build(dis-1);
build(dis+1);
}
int main()
{
int num = 1;
// freopen("d://in.txt","r",stdin);
for(;;)
{
int a;
memset(ans,0,sizeof(ans));
scanf("%d",&a);
if(a == -1) break;
build(500-1);
build(500+1);
ans[500] += a ;
printf("Case %d:\n",num++);
int mark = 0;
for(int i = 0; i < maxn; i++)
if(ans[i] != 0)
{
if(mark == 0 ){printf("%d",ans[i]);mark= 1;}
else printf(" %d",ans[i]);
}
printf("\n\n");
}
return 0;
}