样例没过,但是AC了
查看原帖
样例没过,但是AC了
765476
HERITAGE楼主2024/7/28 15:11

有点玄学。本地测试样例的时候样例爆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;
}
2024/7/28 15:11
加载中...