————————————————————————————————————————————————————————————
玄学调精度
被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; } }