摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
Inna and Alarm Clock ★☆☆☆☆ 答案正确 100 2015-02-26 13:38:29

题意

平面上n个点,最少用几条平行或垂直于x轴的直线才可以全部覆盖。(注意:要求全部同向,第一次交没看到- -)

题解

  • 每次选取能覆盖最多的点的直线就好惹。

代码

390A.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<string>
  4. #include<vector>
  5. #include<iomanip>
  6. #include<algorithm>
  7. #include<cstring>
  8. #include<cmath>
  9. #include<bitset>
  10. #include<set>
  11. #include<sstream>
  12. #include<utility>
  13. using namespace std;
  14. //数据类型//
  15. #define llu unsigned long long
  16. #define lld long long
  17. //定义默认类型//
  18. typedef lld num;
  19. #define dsi(n) num n;scanf("%lld",&n)
  20. #define si(n) scanf("%lld",&n)
  21. //其它//
  22. #define reset(x) memset(x,0,sizeof(x))
  23. #define ci const num&
  24. #define sqr(x) ((x)*(x))
  25. #define f(i,n) for(num i=1;i<=n;++i)
  26. #define ff(i,r,n) for(num i=r;i<=n;++i)
  27. #define fi(n) f(i,n)
  28. #define f0(i,n) for(num i=0;i!=n;++i)
  29. #define fd(i,n) for(num i=n;i>=1;--i)
  30. #define foreach(i,s) for(typeof(s.begin()) i=s.begin();i!=s.end();++i)
  31. #define rforeach(i,s) for(typeof(s.rbegin()) i=s.rbegin();i!=s.rend();++i)
  32. #define iforeach(i,s) int idx=0;for(typeof(s.begin()) i=s.begin();i!=s.end();++i,++idx)
  33. #define Vector2 pair<num,num>
  34. #define vector2(x,y) make_pair(x,y)
  35. #define x first
  36. #define y second
  37. num a1[101][101]={},pointNum1=0,a2[101][101]={},pointNum2=0,
  38. xPNum[101]={},yPNum[101]={},xANum[101]={},yANum[101]={},
  39. xP[101][30010]={},yP[101][30010]={};
  40. void init()
  41. {
  42. reset(xPNum);
  43. reset(yPNum);
  44. reset(xANum);
  45. reset(yANum);
  46. f0(i,101)f0(j,101)
  47. {
  48. if(!a2[i][j])continue;
  49. xP[i][++xPNum[i]]=j;
  50. yP[j][++yPNum[j]]=i;
  51. xANum[i]+=a2[i][j];
  52. yANum[j]+=a2[i][j];
  53. }
  54. }
  55. num getX()
  56. {
  57. num c=0;
  58. while(1)
  59. {
  60. ++c;
  61. Vector2 ans=vector2(0,0);
  62. f0(i,101)
  63. ans=max(ans,vector2(xPNum[i],i));
  64. num tx=ans.y;
  65. fi(xPNum[tx])
  66. {
  67. num ty=xP[tx][i];
  68. yPNum[ty]--;
  69. yANum[ty]-=a1[tx][ty];
  70. a1[tx][ty]=0;
  71. }
  72. pointNum1-=xANum[tx];
  73. xPNum[tx]=xANum[tx]=0;
  74. if(!pointNum1)
  75. {
  76. return c;
  77. }
  78. }
  79. }
  80. num getY()
  81. {
  82. num c=0;
  83. while(1)
  84. {
  85. ++c;
  86. Vector2 ans=vector2(0,0);
  87. f0(i,101)
  88. ans=max(ans,vector2(yPNum[i],i));
  89. num ty=ans.y;
  90. fi(xPNum[ty])
  91. {
  92. num tx=yP[ty][i];
  93. xPNum[tx]--;
  94. xANum[tx]-=a2[tx][ty];
  95. a2[tx][ty]=0;
  96. }
  97. pointNum2-=yANum[ty];
  98. yPNum[ty]=yANum[ty]=0;
  99. if(!pointNum2)
  100. {
  101. return c;
  102. }
  103. }
  104. }
  105. int main()
  106. {
  107. dsi(n);
  108. fi(n)
  109. {
  110. dsi(x);dsi(y);
  111. ++a1[x][y];
  112. ++a2[x][y];
  113. ++pointNum1;
  114. ++pointNum2;
  115. }
  116. init();
  117. num ans1=getX();
  118. init();
  119. num ans2=getY();
  120. cout<<min(ans1,ans2);
  121. return 0;
  122. }

著作权声明[编辑]

关于[编辑]