24點
#include <bits/stdc++.h>
#define pc putchar
#define pb push_back
#define mp make_pair
using namespace std;
double a[10],b[10];
double ans[10][3];
char opt[10];
bool flag;
bool check() {
for (int i = 1; i <= 4; i++) {
if (fabs(a[i] - 24)<1e-8) return 1;
}
return 0;
}
const int maxn = 50000000;
long long cnt;
vector<pair<double,double>> vec[13 * 13 * 13 * 13 + 10];
int id;
double stk1[maxn], stk2[maxn];
int top1, top2;
void solve(int num) {
if (num == 4) {
if (check()) {
double mx=-1e9, mn=1e9;
for (int i = 1; i <= 3; i++) {
mx = max(mx, ans[i][1]);
mx = max(mx, ans[i][0]);
mx = max(mx, ans[i][2]);
mn = min(mn, ans[i][1]);
mn = min(mn, ans[i][0]);
mn = min(mn, ans[i][2]);
}
stk1[++top1] = mn, stk2[++top2] = mx;
vec[id].pb(mp(mn, mx));
cnt++;
flag = 1;
}
return;
}
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 4; j++) {
if (i == j || a[i] == 0 || a[j] == 0) continue;
double x = a[i], y = a[j];
a[i] = x;
a[j] = y;
opt[num] = '+';
ans[num][1] = max(a[i], a[j]);
ans[num][0] = min(a[i], a[j]);
a[j] = x + y;
a[i] = 0;
ans[num][2] = a[j];
solve(num + 1);
a[i] = x;
a[j] = y;
opt[num] = '-';
ans[num][1] = a[i];
ans[num][0] = a[j];
a[j] = x - y;
a[i] = 0;
ans[num][2] = a[j];
solve(num + 1);
a[i] = x;
a[j] = y;
opt[num] = '*';
ans[num][1] = max(a[i], a[j]);
ans[num][0] = min(a[i], a[j]);
a[j] = x * y;
a[i] = 0;
ans[num][2] = a[j];
solve(num + 1);
a[i] = x;
a[j] = y;
opt[num] = '/';
ans[num][1] = max(a[i], a[j]);
ans[num][0] = min(a[i], a[j]);
a[j] = x / y;
a[i] = 0;
ans[num][2] = a[j];
solve(num + 1);
a[i] = x;
a[j] = y;
}
}
}
int stk[13 * 13 * 13 * 13 + 10], top;
int main() {
int lim=13;
for(b[1]=1;b[1]<=lim;b[1]++)for(b[2]=b[1];b[2]<=lim;b[2]++)for(b[3]=b[2];b[3]<=lim;b[3]++)for(b[4]=b[3];b[4]<=lim;b[4]++) {
id++;
for (int i=1;i<=4;i++)a[i]=b[i];
flag = false;
solve(1);
if (flag) {
stk[++top] = id;
}
}
sort(stk1 +1, stk1 + 1 + top1);
top1 = unique(stk1 + 1, stk1 + 1 + top1) - stk1 - 1;
sort(stk2 +1, stk2 + 1 + top2);
top2 = unique(stk2 + 1, stk2 + 1 + top2) - stk2 - 1;
int ans1, ans2;
double MM = 1e9;
for (int i = 1; i <= top1; i++) {
for (int j = 1; j <= top2; j++) {
if (stk1[i] > stk2[j]) continue;
if (stk2[j] - stk1[i] >= MM) continue;
double mn = stk1[i], mx = stk2[j];
bool mark = 1;
for (int k = 1; k <= top; k++) {
bool now = 0;
for (int l = 0; l < vec[stk[k]].size(); l++) {
if (mn <= vec[stk[k]][l].first && vec[stk[k]][l].second <= mx) {
now = 1;
break;
}
}
if (now == 0) {
mark = 0;
break;
}
}
if (mark == 1) {
MM = stk2[j] - stk1[i];
ans1 = i, ans2 = j;
}
}
}
printf("%.10lf", MM);
return 0;
}