(C++)ZOJ-4096——Thanks, TuSimple!(贪心算法)

古城微笑少年丶 2021-12-01 11:16 300阅读 0赞

题目描述

作为TuSimple的经理,您将为开发部门和营销部门举办舞会。 总共会有 n 个绅士和 m 个女士,他们会成对跳舞。 经过仔细调查后,我们已经知道,对于每个人来说,他们喜欢与较高的人或身高较小的人跳舞。 为了简化问题,没有两个身高相同的人,只允许人与异性的人跳舞。 为了保留适当的舞蹈场地,您必须计算同时跳舞的最大可能人数。

题目解析

这道题可以用贪心的思想来解决,而且跳舞的人的喜好一定是0和1配对的

  • 首先男性和女性中的0和1分开,所以对男性和女性根据喜好从小到大排序
  • 而对于相同喜好的人则根据身高从低到高排序
  • 我们让0和1去配对,即我们希望尽量每次可以进行配对,那么我们让喜好为0的人,去和喜好为1且身高最低的异性去匹配

源代码(可AC)

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. const int maxn=2e5+7;
  5. struct People
  6. {
  7. int h;
  8. int like;
  9. }man[maxn],lady[maxn];
  10. bool cmp(People& a,People& b)
  11. {
  12. if(a.like==b.like)
  13. return a.h<b.h;
  14. return a.like<b.like;
  15. }
  16. int main()
  17. {
  18. int t;
  19. cin>>t;
  20. while(t--)
  21. {
  22. int n,m,ans=0;
  23. int M0=0,L0=0;
  24. cin>>n>>m;
  25. for(int i=0;i<n;++i)
  26. cin>>man[i].h;
  27. for(int i=0;i<m;++i)
  28. cin>>lady[i].h;
  29. for(int i=0;i<n;++i)
  30. {
  31. cin>>man[i].like;
  32. if(man[i].like==0)
  33. ++M0;
  34. }
  35. for(int i=0;i<m;++i)
  36. {
  37. cin>>lady[i].like;
  38. if(lady[i].like==0)
  39. ++L0;
  40. }
  41. sort(man,man+n,cmp);
  42. sort(lady,lady+m,cmp);
  43. int j=L0;
  44. for(int i=0;i<M0&&j<m;++i)
  45. {
  46. if(man[i].h>lady[j].h)
  47. {
  48. ++ans;
  49. ++j;
  50. }
  51. }
  52. j=M0;
  53. for(int i=0;i<L0&&j<n;++i)
  54. {
  55. if(lady[i].h>man[j].h)
  56. {
  57. ++ans;
  58. ++j;
  59. }
  60. }
  61. /*int x=0;
  62. for(int i=0;i<M0;++i)
  63. {
  64. //cout<<'*'<<endl;
  65. int flag=0;
  66. for(int j=L0+x;j<m;++j)
  67. {
  68. if(man[i].h>lady[j].h)
  69. {
  70. ++ans;
  71. ++flag;
  72. break;
  73. }
  74. }
  75. if(flag!=0)
  76. {
  77. ++x;
  78. }
  79. }
  80. x=0;
  81. for(int i=0;i<L0;++i)
  82. {
  83. //cout<<'*'<<endl;
  84. int flag=0;
  85. for(int j=M0+x;j<n;++j)
  86. {
  87. if(man[j].h<lady[i].h)
  88. {
  89. ++ans;
  90. ++flag;
  91. break;
  92. }
  93. }
  94. if(flag!=0)
  95. {
  96. ++x;
  97. }
  98. //cout<<x<<endl;
  99. }*/
  100. cout<<ans<<endl;
  101. }
  102. }

发表评论

表情:
评论列表 (有 0 条评论,300人围观)

还没有评论,来说两句吧...

相关阅读

    相关 贪心算法

    贪心算法也称贪婪算法,其核心思想就是:每步都采用最优的做法。        贪心算法所得到的结果往往不是最优的结果(有时候是最优解),但都是相对接近最优解的。       

    相关 贪心算法

    一:贪心算法介绍 1. 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。 2.

    相关 贪心算法

    贪心算法的基本要素 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解呢?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题

    相关 贪心算法

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。举一个简单的贪心法例子,平时

    相关 贪心算法

    1.钞票支付问题,1元,2元,5元,10元,20元,50元,100元钞票无穷张,使用这些钞票怎么支付,最少需要多少张。 思路:尽可能使用面额较大的金额数目。反证法:若不成立,

    相关 贪心算法

    一、什么是贪心算法 贪心算法,又称贪婪算法(Greedy Algorithm),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优解出发来考虑,它