zoukankan      html  css  js  c++  java
  • 【CQYZ-vijos】P1333 舞伴的搭配(贪心算法)

     

     

     

     

    【问题描述】

     

     


      学校要举行一年一度的文艺汇演,笑笑所在年级决定排练一个舞蹈,为选择表演者,老师定下了如下规则:为了舞蹈的美观,当且仅当一男一女的身高之差不超过给定的整数c时,这两个人可以成为舞伴进行演出。笑笑所在年级共有m名男生和n名女生,给定每个人身高(身高在0到1000厘米之间的整数),问最多能有多少对舞蹈者进行演出。

      例如,有3名女生和3名男生,女生身高分别为160cm,170cm,180cm,男生身高分别为170cm,175cm,185cm,c=7cm。那么最多有2对舞蹈者:可以是女2和男1一组,女3和男2一组,共两组(女1不能和任何男生成为一组),所以这个情况下2将成为最后答案。

           

     

     

     

     

     

    【输入格式】

     

     


      第1行三个正整数m,n,c,分别表示男生人数、女生人数和身高最大差值。
      第2行m个整数,分别表示m个男生的身高。
      第3行n个整数,分别表示n个女生的身高。

           

     

     

     

     

     

    【输出格式】

     

     


      仅一个整数,表示舞蹈者的最大数量。

           

     

     

     

     

     

    【输入样例】

     

     


    3 3 7
    170 185 175
    160 170 180

           

     

     

     

     

     

    【输出样例】

     

     


    2

           

     

     

     

     

     

    【数据范围】

     

     


      m,n<=1000

           

    ————————————贪心策略—————————————

    1. 分析

         这次要我们做的是给男生女生分配舞伴,问题是要求出最多舞蹈者组数,也就是求一个最优答案,所以往后的目标就在于:如何做到每一步“看起来最优”

    也就是让每一个舞者所配对的人都恰好处在条件(升高差 < C )边缘

    2. 分步

    这道题的分步很显然是依照配对过程(次数)进行分步,则总步数为:n+m  

    3. 方案

    这道题的方案可以视为:为一位舞者分配最优舞伴,而我们要是他们是恰好的“天生一对” ,不妨在此前先进行排序(推荐:sort),让后从最矮的舞者间开始比较,然后再逐步修改选中舞者

     

     

     

    ————————————代码实现—————————————

     

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 int Boy[1005],Girl[1005];
     6 int m,n,c;
     7 bool cmp(int a,int b){
     8     return a<b;
     9 }
    10 int main(){
    11     cin>>m>>n>>c;
    12     for(int i=1;i<=m;i++){
    13         cin>>Boy[i];
    14     }
    15     for(int i=1;i<=n;i++){
    16         cin>>Girl[i];
    17     }
    18     sort(Boy+1,Boy+1+m,cmp);
    19     sort(Girl+1,Girl+1+n,cmp);
    20     int a=1;   //记录当前选中男生 
    21     int b=1;   //记录当前选中女生 
    22     int count=0; //当前舞者数量 
    23     while(a<=m && b<=n){   //还有剩男和剩女 
    24         if(Boy[a]-Girl[b]>c){  //如果男生太高 
    25             b++;               //访问下一个女生 
    26         }
    27         else if(Girl[b]-Boy[a]>c){  //如果女生太高 
    28             a++;               //访问下一个男生 
    29         }
    30         else {
    31             a++;
    32             b++; 
    33             count++;
    34         }
    35     }
    36     cout<<count;
    37 }
    View Code

    其中有关sort链接:http://www.cnblogs.com/A-Song/archive/2012/02/02/2336337.html

  • 相关阅读:
    第 12 章 Docker Swarm
    第 1 章 虚拟化
    第 0 章 写在最前面
    第 11 章 日志管理
    第 11 章 日志管理
    第 11 章 日志管理
    第 11 章 日志管理
    第 11 章 日志管理
    第 11 章 日志管理
    第 11 章 日志管理
  • 原文地址:https://www.cnblogs.com/Aloyd/p/5695276.html
Copyright © 2011-2022 走看看