#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const int maxn = 10;
int n, cnt,vis[maxn];
double width,w[maxn],l[maxn],r[maxn],res;
void dfs(int cur) {
if (cur >= cnt) {
for (int i = 0; i < cnt; i++) {
if(vis[i]) continue;
if(l[i] + r[i] > width) continue;
res = max(l[i] + r[i], res);
}
return;
}
//任选2个 合并为一个
for (int i = 0;i< cnt;i++)
{
if (vis[i])continue;
for (int j = 0; j < cnt; j++) {
if(i == j || vis[j]) continue;
//当前2个 挂件是如果挂的 i在左 j在右
//w[i] * left = w[j] * right
//w[i] * left = w[j] * (1 - left)
//w[i] * left + w[j] * left = w[j]
//left = w[j] / (w[i] + w[j])
double left = w[j] / (w[i] + w[j]), right = 1 - left;
w[j] += w[i];
vis[i] = 1;
double templ = l[j], tempr = r[j];
//左右分别多宽
l[j] = max(l[i] + left, l[j] - right);
r[j] = max(r[j] + right, r[i] - left);
dfs(cur + 1);
vis[i] = 0;
w[j] -= w[i];
l[j] = templ;
r[j] = tempr;
}
}
}
int main()
{
cin >> n;
while (n--) {
cin >> width >> cnt;
res = -1;
memset(vis, 0, sizeof(vis));
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
for (int i = 0; i < cnt; i++) {
cin >> w[i];
}
dfs(1);
cout << fixed << setprecision(10) << res << endl;
}
return 0;
}
例题7-7(uva-1354)
于 2021-01-02 18:32:12 首次发布

104

被折叠的 条评论
为什么被折叠?



