记录编号 608789 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 2561.[NOIP 2016]愤怒的小鸟 最终得分 100
用户昵称 Gravatar54lku 是否通过 通过
代码语言 C++ 运行时间 1.633 s
提交时间 2025-10-29 12:19:13 内存使用 4.08 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int dp[0b111111111111111111];
const long double esp=1e-10;
struct dot
{
    long double x,y;
    dot(){x=y=0;}
    dot(long double a,long double b){x=a;y=b;}
};
struct func
{
    long double a,b;
    int stu;
    func(){a=b=stu=0;}
    func(dot pos1,dot pos2)
    {
        a=(pos2.x*pos1.y-pos1.x*pos2.y)/(pos1.x*pos2.x*(pos1.x-pos2.x));
        b=(pos1.x*pos1.x*pos2.y-pos2.x*pos2.x*pos1.y)/(pos1.x*pos2.x*(pos1.x-pos2.x));
        stu=0;
    }
    bool suitable(dot pos)
    {
        if(fabs(a*pos.x*pos.x+b*pos.x-pos.y)<esp)
            return 1;
        return 0;
    }
};
vector<func> line;vector<dot> pos;
queue<int> q;
int main()
{
	freopen("angrybirds.in","r",stdin);
	freopen("angrybirds.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;--n;
        pos.clear();
        line.clear();
        while(!q.empty())q.pop();
        for(int i=0;i<=n;i++)
        {
            long double a,b;
            cin>>a>>b;
            pos.push_back(dot(a,b));
        }
        for(int i=0;i<=(1<<(n+1))-1;i++)
            dp[i]=0;
        for(int i=0;i<=n;i++)
        {
        	func p;
        	p.stu=(1<<i);
        	line.push_back(p);
            for(int j=i+1;j<=n;j++)
            {
            	
                if(fabs(pos[i].x-pos[j].x)<esp)continue;
                func tmp=func(pos[i],pos[j]);
                if(tmp.a>=esp||fabs(tmp.a)<esp)continue;
                for(int k=0;k<=n;k++)
                    if(tmp.suitable(pos[k]))
                        tmp.stu|=(1<<k);
                line.push_back(tmp);
            }
        }
        q.push(0);
        while(!q.empty())
        {
            int p=q.front();q.pop();
            for(int i=0;i<(int)line.size();i++)
            {
                if(!dp[p|line[i].stu])
                {
                    dp[p|line[i].stu]=dp[p]+1;
                    q.push(p|line[i].stu);
                }
            }
        }
        cout<<dp[(1<<(n+1))-1]<<'\n';
    }
}