感觉是精度问题(?)
错了两个点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算得就感觉很错误