美團杯

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章