记录编号 |
464705 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2016]愤怒的小鸟 |
最终得分 |
100 |
用户昵称 |
Fisher. |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.331 s |
提交时间 |
2017-10-25 22:18:08 |
内存使用 |
1.32 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define inf 0x3f3f3f3f
#define eps 1e-6
using namespace std;
const int maxn=25;
const int wein=(1<<18)+10;
int t,n,m;
struct zz{long double x,y;}p[maxn];
int f[wein];
int g[maxn][maxn];
inline void init(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>p[i].x>>p[i].y;
}
memset(f,inf,sizeof(f));
f[0]=0;
memset(g,0,sizeof(g));
}
inline void cal(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)continue;
long double a,b;
long double x1=p[i].x*p[i].x*p[j].x;
long double x2=p[i].x*p[j].x*p[j].x;
long double y1=p[i].y*p[j].x;
long double y2=p[j].y*p[i].x;
if(fabs(x1-x2)<eps)continue;
a=(y1-y2)/(x1-x2);
//if(a>0)a=(y2-y1)/(x2-x1);
b=(p[i].y-a*p[i].x*p[i].x)/p[i].x;
if(a>=-eps)continue;
int zt=(1<<(i-1))+(1<<(j-1));
for(int k=1;k<=n;k++){
if(k==i||k==j)continue;
if(fabs(p[k].y-(a*p[k].x*p[k].x+b*p[k].x))<eps)
zt+=(1<<(k-1));
}
g[i][j]=zt;
}
}
}
inline void work(){
int st=(1<<n)-1;
for(int i=0;i<=st;i++){
for(int j=0;j<n;j++){
if((1<<j)&i){
f[i]=min(f[i],f[i-(1<<j)]+1);
for(int k=0;k<n;k++){
if(k==j)continue;
if((g[j+1][k+1]&i)){
f[i]=min(f[i],f[i-(i&g[j+1][k+1])]+1);
}
}
}
}
}
cout<<f[st]<<endl;
}
int main(){
freopen("angrybirds.in","r",stdin);
freopen("angrybirds.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--){
init();
cal();
work();
}
return 0;
}