<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;
}
UVa1354 mobile computering
最新推荐文章于 2025-01-26 23:56:35 发布