#include<bits/stdc++.h>
#define debu
using namespace std;
const int maxn=10;
struct point
{
double l,r;
point(double a=0.0,double b=0.0):l(a),r(b) {}
};
double r;
int n,t,v[1<<maxn];
vector<point> tree[1<<maxn];
double w[maxn],sum[1<<maxn];
void prepare()
{
memset(v,0,sizeof(v));
for(int i=0; i<(1<<n); i++)
{
sum[i]=0;
tree[i].clear();
for(int j=0; j<n; j++)
if(i&(1<<j)) sum[i]+=w[j];
}
}
void solve(int u)
{
if(v[u]) return ;
v[u]=1;
int flag=0;
for(int L=(u-1)&u; L; L=(L-1)&u)
{
flag=1;
int R=u^L;
double rd=sum[L]/sum[u];
double ld=sum[R]/sum[u];
solve(L);
solve(R);
for(int i=0; i<tree[L].size(); i++)
for(int j=0; j<tree[R].size(); j++)
{
point t;
t.l=max(tree[L][i].l+ld,tree[R][j].l-rd);
t.r=max(tree[R][j].r+rd,tree[L][i].r-ld);
if(t.l+t.r<r) tree[u].push_back(t);
}
}
if(!flag)
{
tree[u].push_back(point(0,0));
return ;
}
}
int main()
{
#ifdef debug
freopen("in.in","r",stdin);
#endif // debug
scanf("%d",&t);
while(t--)
{
scanf("%lf%d",&r,&n);
for(int i=0; i<n; i++) scanf("%lf",&w[i]);
prepare();
int root=(1<<n)-1;
solve(root);
double ans=-1;
for(int i=0; i<tree[root].size(); i++)
ans=max(ans,tree[root][i].l+tree[root][i].r);
printf("%.10lf\n",ans);
}
return 0;
}
UVA 1354(p197)----Mobile Computing
最新推荐文章于 2020-05-24 11:06:00 发布