【CQYZ-vijos】P1333 舞伴的搭配(贪心算法)

来源:互联网 发布:cookie登录 php 编辑:程序博客网 时间:2024/05/16 04:46


 

 

 

 

【问题描述】

 

 


  学校要举行一年一度的文艺汇演,笑笑所在年级决定排练一个舞蹈,为选择表演者,老师定下了如下规则:为了舞蹈的美观,当且仅当一男一女的身高之差不超过给定的整数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),让后从最矮的舞者间开始比较,然后再逐步修改选中舞者

 

 

 

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

 

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int Boy[1005],Girl[1005];int m,n,c;bool cmp(int a,int b){     return a<b;}int main(){    cin>>m>>n>>c;    for(int i=1;i<=m;i++){        cin>>Boy[i];    }    for(int i=1;i<=n;i++){        cin>>Girl[i];    }    sort(Boy+1,Boy+1+m,cmp);    sort(Girl+1,Girl+1+n,cmp);    int a=1;   //记录当前选中男生     int b=1;   //记录当前选中女生     int count=0; //当前舞者数量     while(a<=m && b<=n){   //还有剩男和剩女         if(Boy[a]-Girl[b]>c){  //如果男生太高             b++;               //访问下一个女生         }        else if(Girl[b]-Boy[a]>c){  //如果女生太高             a++;               //访问下一个男生         }        else {            a++;            b++;             count++;        }    }    cout<<count;}

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

0 0
原创粉丝点击