您的位置:首页 > 其它

章七例题七 Mobile Computing UVA - 1354(枚举二叉树)

2017-03-27 16:18 281 查看
感觉到寸步难行。。然后看了大神们的代码,和题解后。可以敲出来,但是感觉自己理解的还不是很深刻

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;
int vis[150],n;
double a[150];
int node[150];
double val[150],l[150],r[150];//开小了后会WA或者re
double rm,ans;
void judge(int k)
{
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
memset(val,0,sizeof(val));
for(int i=k;i>=1;i--){
if(node[i]==-1)
{
int x=i*2,y=i*2+1;
val[i]=val[x]+val[y];
double L=val[y]/val[i];
double R=val[x]/val[i];
l[i]=min(-L+l[x],R+l[y]);
r[i]=max(-L+r[x],R+r[y]);
}
else if(node[i])
val[i]=a[node[i]];
}
double temp=r[1]-l[1];
if(temp-rm<1e-5) ans=max(ans,temp);
}
void dfs(int now,int kong,int num)
{
if(num==0)
{
judge(now-1);
return ;
}
if(node[now/2]!=-1)
dfs(now+1,kong,num);
else
{
if(num>kong)
{
node[now]=-1;
dfs(now+1,kong+1,num);
node[now]=0;
}
if(kong==1&&num>1) return ;//这个不能掉了
for(int i=1;i<=n;i++){
if(!vis[i]){
node[now]=i;
vis[i]=1;
dfs(now+1,kong-1,num-1);
node[now]=0,vis[i]=0;
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf %d",&rm,&n);
memset(vis,0,sizeof(vis));
memset(node,0,sizeof(node));
memset(a,0,siz
4000
eof(a));
for(int i=1;i<=n;i++)
scanf("%lf",&a[i]);
node[1]=-1;
ans=-1;
if(n==1)
printf("%.10lf\n",0.0);
else{
dfs(2,2,n);
if(ans==-1) printf("-1\n");//不要掉了/n aaa
else printf("%.10lf\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: