记录编号 405107 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2016]愤怒的小鸟 最终得分 100
用户昵称 GravatarBaDBoY 是否通过 通过
代码语言 C++ 运行时间 1.610 s
提交时间 2017-05-15 17:19:27 内存使用 1.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define pp 0.000001
int t,n,m,kk[20][20],f[(1<<18)+5];
double x[20],y[20];
inline double oo(double x){
  if(x<0) return (-x);
  else return x;
}
inline void init(){
   memset(kk,0,sizeof(kk));
   for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++){
      if(oo(x[i]-x[j])<=0.000001) continue;
      double a=(x[i]*y[j]-x[j]*y[i])/(x[i]*x[j]*x[j]-x[i]*x[i]*x[j]);
      double b=(y[i]*x[j]*x[j]-y[j]*x[i]*x[i])/(x[i]*x[j]*x[j]-x[j]*x[i]*x[i]);
      if(a>=-0.000001) continue;
      for(int k=1;k<=n;k++)
       if(oo(a*x[k]*x[k]+b*x[k]-y[k])<=0.000001)
        kk[i][j]|=(1<<(k-1));
      }   
}
inline void dp(){
    memset(f,0x7f,sizeof(f));
    f[0]=0;
    for(int r=0;r<(1<<n);r++)
     for(int i=1;i<=n;i++)
      if(!(r&(1<<(i-1)))){ //!!状态不包含当前鸟 
       for(int j=i;j<=n;j++){
         int temp=r|kk[i][j];
         f[temp]=min(f[temp],f[r]+1);
       }
       f[r|(1<<(i-1))]=min(f[r|(1<<(i-1))],f[r]+1);
       //转移当前状态否则如果单个单个数则无法处理
       //如例2 第一个点两个鸟无法构成一个抛物线图像!!! 
      } 
    /*for(int i=0;i<(1<<n);i++)
     cout<<f[i]<<endl;
    cout<<endl;*/
    //if(f[(1<<n)-1]>=2130000000) printf("%d\n",n);
    printf("%d\n",f[(1<<n)-1]);
}
int main(){
   freopen("angrybirds.in","r",stdin);
   freopen("angrybirds.out","w",stdout);
   scanf("%d",&t);
   while(t--){
     scanf("%d%d",&n,&m);   
     for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
     init(); 
     /*for(int i=0;i<=n;i++)
      for(int j=i+1;j<=n;j++)
       cout<<kk[i][j]<<endl;*/
     dp();
   }
  // while(1);
   return 0;
}