这道题刚开始纠结于输入,还是题刷少了。囧!本来想用strchr函数和指针来操作的,但是在输入的时候很纠结,就放弃了。这是poj 2255的加强版,不用真正的建树后在遍历,直接模拟建树的过程就解决了。
下面是代码:
#include<stdio.h>
#include<string.h>
#define MAXN 10010
int ans,flag,n;
int s1[MAXN],s2[MAXN];
int find_root(int b1,int e1,int e2)
{
for(int i=b1;i<=e1;++i)//刚开始的时候没有等号,直接tle了,囧!
{
if(s1[i]==s2[e2]) return i;
}
}
void rebuild(int b1,int e1,int b2,int e2,int sum)
{
if(b1>e1) return;
sum+=s2[e2];
if(b1==e1)
{
if(sum<=ans)
{
if(sum==ans)
{
if(s2[e2]<flag) flag=s2[e2];
}
else
{
ans=sum;
flag=s2[e2];
}
}
return;
}
int p=find_root(b1,e1,e2);//找根节点的位置
rebuild(b1,p-1,b2,b2+p-b1-1,sum);//递归建左子树
rebuild(p+1,e1,b2+p-b1,e2-1,sum);//递归建右子树
}
int main()
{
char ch;
n=0;
while(scanf("%d%c",&s1[n++],&ch)==2)//这样输入
{
if(ch=='\n'){
for(int i=0;i<n;++i) scanf("%d",&s2[i]);
ans=1000000000;
rebuild(0,n-1,0,n-1,0);
printf("%d\n",flag);
n=0;
}
}
return 0;
}
Come on!