有点玄学。本地测试样例的时候样例爆WA但是上到luogu 上面就AC了。
本地输出:
样例2
3
2 0
1.41 2.00
1.73 3.00
3 0
1.11 1.41
2.34 1.79
2.98 1.49
5 0
2.72 2.72
2.72 3.14
3.14 2.72
3.14 3.14
5.00 5.00
对应输出:
2
1
1
样例3
对应输出:
4
代码(AC):
// 状压DP
#include <bits/stdc++.h>
const double eps = 1e-9;
const int MAXS = 1 << 19;
const int MAXN = 210;
int n, m, g[MAXN], f[MAXS];
double a, b, x[50], y[50];
int T;
void getCoeff(int i, int j)
{
a = (y[i] * x[j] - y[j] * x[i]) / (x[i] * x[i] * x[j] - x[i] * x[j] * x[j]);
b = (x[j] * x[j] * y[i] - y[j] * x[i] * x[i]) / (x[i] * x[j] * x[j] - x[i] * x[i] * x[j]);
}
bool hit(int i) { return abs(a * x[i] * x[i] + b * x[i] - y[i]) < eps; }
void solution()
{
int num = 0;
memset(f, 0x3f, sizeof f);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%lf%lf", x + i, y + i);
g[num++] = 1 << (i - 1);
}
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
{
getCoeff(i, j);
if (a >= 0)
continue;
int s = 0;
for (int k = 1; k <= n; k++)
if (hit(k))
s += (1 << (k - 1));
g[num++] = s;
}
f[0] = 0;
for (int i = 0; i < (1 << n); i++)
for (int j = 0; j < num; j++)
f[i | g[j]] = std::min(f[i | g[j]], f[i] + 1);
printf("%d\n", f[(1 << n) - 1]);
}
int main()
{
scanf("%d", &T);
while (T--)
solution();
return 0;
}