记录编号 608870 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 2561.[NOIP 2016]愤怒的小鸟 最终得分 100
用户昵称 Gravatarwdsjl 是否通过 通过
代码语言 C++ 运行时间 0.730 s
提交时间 2025-10-29 21:45:51 内存使用 8.87 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const double eps = 1e-8;
int t, n, m, lines[20][20], lowunbit[1 << 20], dp[1 << 20];
double x[20], y[20];

void equation(double &x, double &y, double a1, double b1, double c1, double a2, double b2, double c2) {
    y = (a1 * c2 - a2 * c1) / (a1 * b2 - a2 * b1);
    x = (c1 - b1 * y) / a1;
}

int main() {
	freopen("angrybirds.in","r",stdin);
	freopen("angrybirds.out","w",stdout);
    for (int i = 0; i < (1 << 18); i++) {
        int j = 1;
        for (; j <= 18 && (i & (1 << (j - 1))); j++);
        lowunbit[i] = j;
    }
    scanf("%d", &t);
    while (t--) {
        memset(lines, 0, sizeof(lines));
        memset(dp, 0x3f, sizeof(dp));
        dp[0] = 0;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) {
            scanf("%lf%lf", x + i, y + i);
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (fabs(x[i] - x[j]) < eps) {
                    continue;
                }
                double a, b;
                equation(a, b, x[i] * x[i], x[i], y[i], x[j] * x[j], x[j], y[j]);
                if (a > -eps) {
                    continue;
                }
                for (int k = 1; k <= n; k++) {
                    if (fabs(a * x[k] * x[k] + b * x[k] - y[k]) < eps) {
                        lines[i][j] |= (1 << (k - 1));
                    }
                }
            }
        }
        for (int i = 0; i < (1 << n); i++) {
            int j = lowunbit[i];
            dp[i | (1 << (j - 1))] = min(dp[i | (1 << (j - 1))], dp[i] + 1);
            for (int k = 1; k <= n; k++) {
                dp[i | lines[j][k]] = min(dp[i | lines[j][k]], dp[i] + 1);
            }
        }
        printf("%d\n", dp[(1 << n) - 1]);
    }
    return 0;
}