【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

转载于:https://www.cnblogs.com/Aloyd/p/5695276.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值