您的位置:首页 > 其它

【暴力】vijos P1897 学姐吃牛排

2014-11-01 08:09 225 查看
判断堆:递归判断每个节点的孩子是否都比其父亲大(小)。

判断BST:中序遍历是否有序。

#include<cstdio>
using namespace std;
#define lc (rt<<1)
#define rc (rt<<1|1)
int T,n,a[1001],b[1001],en;
void Mid(int rt)
{
if(lc<=n) Mid(lc);
b[++en]=a[rt];
if(rc<=n) Mid(rc);
}
bool is_BST()
{
bool f1=1,f2=1; en=0; Mid(1);
for(int i=2;i<=n;i++) if(b[i]<b[i-1]) {f1=0; break;}
if(f1) return 1;
for(int i=2;i<=n;i++) if(b[i]>b[i-1]) {f2=0; break;}
if(f2) return 1;
return 0;
}
bool is_Heap(int rt)
{
if(lc<=n)
{
if(a[lc]>a[rt]) return 0;
if(!is_Heap(lc)) return 0;
}
if(rc<=n)
{
if(a[rc]>a[rt]) return 0;
if(!is_Heap(rc)) return 0;
}
return 1;
}
bool is_Heap_2(int rt)
{
if(lc<=n)
{
if(a[lc]<a[rt]) return 0;
if(!is_Heap_2(lc)) return 0;
}
if(rc<=n)
{
if(a[rc]<a[rt]) return 0;
if(!is_Heap_2(rc)) return 0;
}
return 1;
}
int main()
{
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
printf("Case #%d: ",i);
scanf("%d",&n);
for(int j=1;j<=n;j++) scanf("%d",&a[j]);
bool flag1=0,flag2=0;
if(is_BST()) flag1=1;
if(is_Heap(1)) flag2=1;
if((!flag2)) if(is_Heap_2(1)) flag2=1;
if(flag1&&flag2) puts("Both");
else if(flag1) puts("BST");
else if(flag2) puts("Heap");
else puts("Neither");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: