题目链接

题意:

  在一个宽为r 的房间里, 有s个砝码, 每个天平的一端要么挂砝码, 要么挂另一个天平, 并且每个天平要保持平衡。

  求使得所有砝码都放在天平上, 且总宽度不超过房间宽度的最大值。

思路:

  每个节点只能有两个子节点, 这是一棵二叉树的形式。

  通过枚举二叉树的形态, 再枚举每一个叶子节点所放砝码, 最后再计算每个方案的宽度并计算答案。

  每增加一个天平, 那么可以放砝码数 + 1。

note:

  坑在0的输出了, 用primtf("%.9lf\n", 0)输出来的是0  用0.0来输出才是0.000000 惨wa三发。

代码:

  

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define eps 1e-5
#define MAXN 110
#define MAXM 100
#define dd {cout<<"debug"<<endl;}
#define pa {system("pause");}
#define p(x) {cout<<x<<endl;}
#define pd(x) {printf("%.7lf\n", x);}
#define k(x) {printf("Case %d: ", ++x);}
#define s(x) {scanf("%d", &x);}
#define sd(x) {scanf("%lf", &x);}
#define mes(x, d) {memset(x, d, sizeof(x));}
#define do(i, x) for(i = 0; i < x; i ++)
#define dod(i, x, l) for(i = x; i >= l; i --)
#define doe(i, x) for(i = 1; i <= x; i ++)
int n;
double r, ans;
double w[MAXN], v[MAXN];
double ll[MAXN], rr[MAXN];
bool vis[MAXN];
int order[MAXN];
void read()
{
scanf("%lf", &r);
scanf("%d", &n);
for (int i = ; i <= n; i ++)
scanf("%lf", &w[i]);
}
void get_ans(int u)
{
memset(ll, , sizeof(ll));
memset(rr, , sizeof(rr));
memset(v, , sizeof(v)); for (int i = u; i > ; i --)
{
if (order[i] == -)
{
int x = i * ;
int y = i * + ;
v[i] = v[x] + v[y];
double li = v[y] / v[i];
double ri = v[x] / v[i]; ll[i] = min(-li + ll[x], ri + ll[y]);
rr[i] = max(-li + rr[x], ri + rr[y]);
}
else if (order[i])
{
v[i] = w[order[i]];
}
} double temp = rr[] - ll[];
//printf("%.9lf\n", temp);
if (temp - r < eps && temp > ans)
ans = temp;
} void dfs(int u, int num, int count)
{
//printf("%d %d %d\n", u, num, count);
if (count == )
{
get_ans(u - );
return ;
}
else if (order[u / ] != -)
{
dfs(u + , num, count);
}
else
{
if (count > num)
{
order[u] = -;
dfs(u + , num + , count);
order[u] = ;
} if (num == && count > )
return ;
for (int i = ; i <= n; i ++)
if (!vis[i])
{
vis[i] = true;
order[u] = i;
dfs(u + , num - , count - );
order[u] = ;
vis[i] = false;
}
}
}
void solve()
{
memset(vis, false, sizeof(vis));
memset(order, , sizeof(order));
ans = -;
if (n == ) printf("%.10lf\n", 0.0);
else
{
order[] = -;
dfs(, , n);
printf(ans == -? "-1\n" : "%.10lf\n", ans);
}
} int main()
{
int T;
scanf("%d", &T);
while (T --)
{
read();
solve();
}
return ;
}

最新文章

  1. Contents Of My Blogs
  2. Delphi_03_Delphi_Object_Pascal_基本语法_01
  3. 安装AdventureWorks2008R2
  4. 初学python里的yield send next
  5. 离线更新SEPM服务器的病毒定义库
  6. PAT乙级 1014. 福尔摩斯的约会 (20)
  7. win32 sdk显示一个载入的位图的方法
  8. poj 3537 Crosses and Crosses 博弈论
  9. leetcode:Number of 1 Bits
  10. windows store app 读写图片
  11. ASP.NET MVC- MvcPager
  12. 控制反转(IoC)与依赖注入(DI)
  13. oracle中所有关于时间日期的问题总结
  14. 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋
  15. Linux 配置多IP
  16. UVALIVE 5893 计算几何+搜索
  17. 运行mvc报“无法确定存储版本;需要有效的存储连接或版本提示”
  18. SQL SERVER 报:由于数据移动,未能继续以 NOLOCK 方式扫描错误的解决办法。
  19. C# 多线程、异步线程、线程池相关知识
  20. viim命令行模式查找替换

热门文章

  1. cocos2d-x 3.0 Armature jsb 初体验
  2. Monitoring and Tuning the Linux Networking Stack: Receiving Data
  3. autocommit=0
  4. Java基础知识强化之集合框架笔记73:如何选择使用哪种集合
  5. Java基础知识强化之集合框架笔记72:集合特点和数据结构总结
  6. HINSTANCE数据类型
  7. 无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本。
  8. datetimepicker 初始化只显示年
  9. 【转】ArrayList的toArray
  10. EF6调用存储过程,返回多个结果集处理