UVA 1354(p197)----Mobile Computing

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值