欢迎来到SFWR的博客

P2831 愤怒的小鸟

————————————————————————————————————————————————————————————

玄学调精度

被if else的嵌套搞了,压行选手的痛,以后还是要注意点

——————————————————————————————————————————————————————————

#include<bits/stdc++.h>
using namespace std;
#define setfin(x) memset(x,0,sizeof(x));
#define setfax(x) memset(x,0x3f,sizeof(x));
#define ld double
ld x[20],y[20];
int gk[20][20],t,n,dp[(1<<18)+5],judge[20],q;
int calc(int d1,int d2)
{
    ld x1=x[d1],y1=y[d1],x2=x[d2],y2=y[d2];
    ld tx=x1*x1*x2-x2*x2*x1,ty=y1*x2-y2*x1;
    ld a=ty/tx,b=(y1-a*x1*x1)/x1;
    if(a>=0) return 0;
    int res=0;
    judge[d1]=judge[d2]=1;
    for(int i=1;i<=n;i++)
    if(fabs(a*x[i]*x[i]+b*x[i]-y[i])<1e-7)res|=1<<(i-1),dp[res]=1;
    return res;
}
int main()
{
    cin>>t;
    while(t--)
    {    
        setfin(judge);setfin(gk);setfax(dp);
        cin>>n>>q;
        for(int i=1;i<=n;i++){cin>>x[i]>>y[i];dp[1<<i-1]=1;}
        dp[0]=0;
        for(int i=1;i<=n;i++)for(int j=1;j<i;j++)gk[i][j]=calc(i,j);
        for(int i=0;i<1<<n;i++)for(int j=1;j<=n;j++)
        if(!(i&(1<<j-1)))
        {
            if(judge[j])for(int k=1;k<j;k++)
            if(!(i&(1<<k-1)))dp[i|gk[j][k]]=min(dp[i|gk[j][k]],dp[i]+1);    
            dp[i|(1<<j-1)]=min(dp[i|(1<<j-1)],dp[i]+1);
        }
        cout<<dp[(1<<n)-1]<<endl;
    }
}

 

posted @ 2019-08-05 17:01  SFWR  Views(175)  Comments(0Edit  收藏  举报