UVa1354 mobile computering

本文探讨了使用C++实现复杂数论问题的解决策略,包括使用位操作和深度优先搜索来优化算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<vector>
#define INF 0x3f3f3f3f
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N = 6;
const int MAXN = (1<<N);
int t, n, i, j, vis[MAXN];
double w[N], sumw[MAXN], r;
struct Node{
    double l, r;
    Node() {}
    Node(double ll, double rr) { l = ll ; r = rr; }
};
vector<Node> node[MAXN];
int bitcount(int x){
    if(x == 0) return 0;
    return bitcount(x/2)+(x&1);
}
void dfs(int s){
    if(vis[s]) return;
    vis[s] = 1;
    if(bitcount(s) == 1){
        node[s].push_back(Node(0,0));
        return;
    }
    for(int l =(s-1)&s; l>0; l=(l-1)&s){
        int r =s^l;
        dfs(l); dfs(r);
        for(int i=0; i < node[l].size(); i++){
            for(int j=0; j<node[r].size(); j++){
                double ll = min(-sumw[r]/(sumw[l]+sumw[r])+node[l][i].l, sumw[l]/(sumw[l]+sumw[r])+node[r][j].l);
                double rr = max(sumw[l] / (sumw[l]+sumw[r])+node[r][j].r, -sumw[r]/(sumw[l]+sumw[r])+node[l][i].r);
                node[s].push_back(Node(ll,rr));
            }
        }
    }
}
void solve()
{
    double ans=-1;
    int s=(1<<n)-1;
    dfs(s);
    for(int i=0; i < node[s].size(); i++){
        if(node[s][i].r-node[s][i].l < r){
            if(node[s][i].r-node[s][i].l > ans)
                ans = node[s][i].r - node[s][i].l;
        }
    }
    if(ans == -1) printf("-1\n");
    else printf("%.10lf\n",ans);
}
int main()
{
    scanf("%d", &t);
    while(t--){
        memset(vis, 0, sizeof(vis));
        memset(node, 0, sizeof(node));
        scanf("%lf%d", &r, &n);
        for(i=0; i<n; i++)
            scanf("%lf", &w[i]);
        for(i=0; i<(1<<n); i++){
            sumw[i]=0;
            for(j =0; j<n; j++){
                if(i&(1<<j))
                    sumw[i]+=w[j];
            }
        }
        solve();
    }
    return 0;
}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值