比赛 2017noip 评测结果 WWWWWWWWWWWWAWWAAWAA
题目名称 愤怒的小鸟 最终得分 25
用户昵称 玉带林中挂 运行时间 2.566 s
代码语言 C++ 内存使用 4.33 MiB
提交时间 2017-09-21 11:23:46
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int min(int x,int y)
{
  if(x<=y)  return x;
  else  return y;
}
bool check(double x,double y)
{
  if(abs(x-y)<0.000000001)  return true;
  else  return false;
}
int t,n,m;
int g[30][30],f[1<<20];
double x[30],y[30],a[30][30],b[30][30];
int main()
{
  freopen("angrybirds.in","r",stdin);freopen("angrybirds.out","w",stdout);
  scanf("%d",&t);
  while(t--)
  {
    memset(g,0,sizeof(g));
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(f,0x3f,sizeof(f));
    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=i+1;j<=n;++j)
      {
        if(x[i]==x[j])
        {
          a[i][j]=5;
          continue;
        }
        if(check(y[i]/x[i],y[j]/x[j]))
        {
          a[i][j]=5;
          continue;
        }
        a[i][j]=y[i]/(x[i]*(x[i]-x[j]))-y[j]/(x[j]*(x[i]-x[j]));
        b[i][j]=(x[i]*x[i]*y[j]-x[j]*x[j]*y[i])/(x[i]*x[i]*x[j]-x[j]*x[j]*x[i]);
        for(int k=1;k<=n;++k)
          if(check(a[i][j]*x[k]*x[k]+b[i][j]*x[k],y[k]))
            g[i][j]=g[i][j]|(1<<(k-1));
      }
    f[0]=0;
    for(int i=0;i<(1<<n);++i)
      for(int j=1;j<=n;++j)
        for(int k=j+1;k<=n;++k)
        {
          if(a[j][k]>-0.00000001)
          {
            f[i]=min(f[i],f[i&(~g[j][k])]+2);
            continue;
          }
          f[i]=min(f[i],f[i&(~g[j][k])]+1);
        }
    printf("%d\n",f[(1<<n)-1]);
  }
  return 0;
}