记录编号 38421 评测结果 AAAAAT
题目名称 圣诞节 最终得分 83
用户昵称 GravatarMakazeu 是否通过 未通过
代码语言 C++ 运行时间 1.041 s
提交时间 2012-04-18 18:20:25 内存使用 0.21 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #define MAXN 501
  5. using namespace std;
  6. int Age[MAXN*2],H[MAXN*2];
  7. int Mat[MAXN],Used[MAXN];
  8. int Diff[MAXN][MAXN];
  9. int N,P,X;
  10. int ans;
  11. inline void init()
  12. {
  13. scanf("%d\n",&N); P=N*2;
  14. for(int i=1;i<=P;i++) scanf("%d %d\n",&H[i],&Age[i]);
  15. for(int i=1;i<=N;i++)
  16. for(int j=1;j<=N;j++)
  17. Diff[i][j]=(Age[i]-Age[j+N])*(Age[i]-Age[j+N])+(H[i]-H[j+N])*(H[i]-H[j+N]);
  18. }
  19.  
  20. bool cross(int k)
  21. {
  22. int v;
  23. for(int i=1;i<=N;i++)
  24. {
  25. if(Diff[k][i]>X) continue;
  26. if(Used[i]) continue;
  27. Used[i]=1;
  28. if(!Mat[i] || cross(Mat[i]))
  29. {
  30. Mat[i]=k;
  31. return true;
  32. }
  33. }
  34. return false;
  35. }
  36.  
  37. inline bool hungary()
  38. {
  39. int Ans=0;
  40. for(int i=1;i<=N;i++)
  41. {
  42. memset(Used,0,sizeof(Used));
  43. Ans+=cross(i);
  44. }
  45. return Ans==N;
  46. }
  47.  
  48. inline void binarysearch()
  49. {
  50. int l=0,r=12500,mid;
  51. while(l<=r)
  52. {
  53. mid=(l+r)>>1;
  54. X=mid;
  55. memset(Mat,0,sizeof(Mat));
  56. if(hungary()) r=mid-1,ans=mid;
  57. else l=mid+1;
  58. }
  59. printf("%d\n",ans);
  60. }
  61.  
  62. int main()
  63. {
  64. freopen("christmas.in","r",stdin);
  65. freopen("christmas.out","w",stdout);
  66. init();
  67. binarysearch();
  68. return 0;
  69. }