求助状压
查看原帖
求助状压
141599
sinsop90楼主2021/11/17 15:11

感觉是精度问题(?)

错了两个点WA, 90pts

#include <bits/stdc++.h>
#define int long long
#define maxn 22
#define eps 1e-8
using namespace std;
int T, n, m, f[(1 << maxn)];
bool fdp[(1 << maxn)];
double X[maxn], Y[maxn];
signed main() {
	scanf("%lld", &T);
	while(T--) {
		memset(f, 0x3f3f3f, sizeof(f));
		memset(fdp, false, sizeof(fdp));
		scanf("%lld%lld", &n, &m);
		for(int i = 1;i <= n;i++) {
			scanf("%lf%lf", &X[i], &Y[i]);
		}
		for(int i = 1;i <= n;i++) {
			int S = (1 << (i - 1));
			fdp[S] = true;
			f[S] = 1;
		}
		for(int i = 1;i <= n;i++) {
			for(int j = 1;j <= n;j++) {
				int S = 0;
				if(X[i] - X[j] < eps) continue;
				S = S | (1 << (i - 1));
				S = S | (1 << (j - 1));
				double b = (Y[i] * X[j] * X[j] - Y[j] * X[i] * X[i]) / (X[i] * X[j] * X[j] - X[i] * X[i] * X[j]);
				double a = (Y[j] * X[i] - Y[i] * X[j]) / (X[i] * X[j] * X[j] - X[i] * X[i] * X[j]);
				if(a > -eps) continue;
				for(int k = 1;k <= n;k++) if(a * X[k] * X[k] + b * X[k] == Y[k]) S |= (1 << (k - 1));
//				cout << a << " " << b << " " << i << " " << j << " " << S << endl;
//				dp[i][j] = S;
				f[S] = 1;
				fdp[S] = true;
			}
		}
		for(int i = 0;i <= (1 << n) - 1;i++) {
			for(int j = (i - 1) & i;j;j = (j - 1) & i) {
				if(fdp[i - j]) f[i] = min(f[i], f[j] + 1);
			}
		}
		cout << f[(1 << n) - 1] << endl;
	}
}

这a和b算得就感觉很错误

2021/11/17 15:11
加载中...