记录编号 |
405107 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2016]愤怒的小鸟 |
最终得分 |
100 |
用户昵称 |
BaDBoY |
是否通过 |
通过 |
代码语言 |
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;
- }