记录编号 38837 评测结果 AAAAAAAAAA
题目名称 导弹拦截 最终得分 100
用户昵称 Gravatarkaaala 是否通过 通过
代码语言 C++ 运行时间 0.887 s
提交时间 2012-06-15 19:55:33 内存使用 0.34 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<algorithm>
  7.  
  8. using namespace std;
  9.  
  10. const int oo=~0u>>2;
  11.  
  12. struct type
  13. {
  14. int x,y,z;
  15. }A[1010];
  16.  
  17. struct edge
  18. {
  19. int t;
  20. edge *next;
  21. edge(int _t,edge *_next):t(_t),next(_next){}
  22. }*Map[1010];
  23.  
  24. int N,ans1,ans2,pre[1010],f[1010];
  25. bool vis[1010];
  26.  
  27. void addedge(int s,int t)
  28. {
  29. Map[s]=new edge(t,Map[s]);
  30. }
  31. int cmp(const void *a,const void *b)
  32. {
  33. if(((type *)a)->x>((type *)b)->x)
  34. return 1;
  35. return -1;
  36. }
  37.  
  38. void dp()
  39. {
  40. for(int i=1;i<=N;i++)
  41. f[i]=1;
  42. for(int i=1;i<=N;i++)
  43. for(int j=1;j<i;j++)
  44. if(A[i].x>A[j].x&&A[i].y>A[j].y&&A[i].z>A[j].z)
  45. {
  46. if(f[j]+1>f[i])
  47. f[i]=f[j]+1;
  48. addedge(j,i);
  49. }
  50. for(int i=1;i<=N;i++)
  51. ans1=max(ans1,f[i]);
  52. }
  53.  
  54. bool solve(int u)
  55. {
  56. for(edge *p=Map[u];p;p=p->next)
  57. {
  58. int t=p->t;
  59. if(vis[t])
  60. continue;
  61. vis[t]=true;
  62. if(!pre[t]||solve(pre[t]))
  63. {
  64. pre[t]=u;
  65. return true;
  66. }
  67. }
  68. return false;
  69. }
  70.  
  71. int main()
  72. {
  73. freopen("bomba.in","r",stdin);
  74. freopen("bomba.out","w",stdout);
  75. scanf("%d",&N);
  76. for(int i=1;i<=N;i++)
  77. scanf("%d%d%d",&A[i].x,&A[i].y,&A[i].z);
  78. qsort(A+1,N,sizeof(A[0]),cmp);
  79. dp();
  80. ans2=N;
  81. for(int i=1;i<=N;i++)
  82. {
  83. memset(vis,0,sizeof(vis));
  84. ans2-=solve(i);
  85. }
  86. printf("%d\n%d\n",ans1,ans2);
  87. return 0;
  88. }