记录编号 405107 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2016]愤怒的小鸟 最终得分 100
用户昵称 GravatarBaDBoY 是否通过 通过
代码语言 C++ 运行时间 1.610 s
提交时间 2017-05-15 17:19:27 内存使用 1.32 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. #define pp 0.000001
  7. int t,n,m,kk[20][20],f[(1<<18)+5];
  8. double x[20],y[20];
  9. inline double oo(double x){
  10. if(x<0) return (-x);
  11. else return x;
  12. }
  13. inline void init(){
  14. memset(kk,0,sizeof(kk));
  15. for(int i=1;i<=n;i++)
  16. for(int j=i+1;j<=n;j++){
  17. if(oo(x[i]-x[j])<=0.000001) continue;
  18. double a=(x[i]*y[j]-x[j]*y[i])/(x[i]*x[j]*x[j]-x[i]*x[i]*x[j]);
  19. 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]);
  20. if(a>=-0.000001) continue;
  21. for(int k=1;k<=n;k++)
  22. if(oo(a*x[k]*x[k]+b*x[k]-y[k])<=0.000001)
  23. kk[i][j]|=(1<<(k-1));
  24. }
  25. }
  26. inline void dp(){
  27. memset(f,0x7f,sizeof(f));
  28. f[0]=0;
  29. for(int r=0;r<(1<<n);r++)
  30. for(int i=1;i<=n;i++)
  31. if(!(r&(1<<(i-1)))){ //!!状态不包含当前鸟
  32. for(int j=i;j<=n;j++){
  33. int temp=r|kk[i][j];
  34. f[temp]=min(f[temp],f[r]+1);
  35. }
  36. f[r|(1<<(i-1))]=min(f[r|(1<<(i-1))],f[r]+1);
  37. //转移当前状态否则如果单个单个数则无法处理
  38. //如例2 第一个点两个鸟无法构成一个抛物线图像!!!
  39. }
  40. /*for(int i=0;i<(1<<n);i++)
  41. cout<<f[i]<<endl;
  42. cout<<endl;*/
  43. //if(f[(1<<n)-1]>=2130000000) printf("%d\n",n);
  44. printf("%d\n",f[(1<<n)-1]);
  45. }
  46. int main(){
  47. freopen("angrybirds.in","r",stdin);
  48. freopen("angrybirds.out","w",stdout);
  49. scanf("%d",&t);
  50. while(t--){
  51. scanf("%d%d",&n,&m);
  52. for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
  53. init();
  54. /*for(int i=0;i<=n;i++)
  55. for(int j=i+1;j<=n;j++)
  56. cout<<kk[i][j]<<endl;*/
  57. dp();
  58. }
  59. // while(1);
  60. return 0;
  61. }