题目描述
在舞会上有N个男孩和N个女孩,每个人都量过了自己的身高。每个男孩只跟女孩跳舞,并且女孩也只跟男孩跳舞。每个人最多只有一个舞伴。男孩或者想和比自己高的女孩跳舞,或者想和比自己低的女孩跳舞,同样的,女孩也是或者想和比自己高的男孩跳舞,或者想和自己低的男孩跳舞。
你能决定最多有多少对能在一起跳舞么?
输入
第一行是一个正整数N(1<=N<=100000),表示男女的人数。第二行包括N个绝对值在1500到2500的整数,每个整数的绝对值表示每个男孩的身高。如果是一个正整数,表示这个男的喜欢和比他高的女孩跳舞,如果是负整数,就表示这个男的喜欢和比他低的女孩跳舞。第三行包括N个整数,每个整数的绝对值表示相应女孩的身高。同样的,如果是正整数的话,表示这个女孩喜欢和比她高的男孩跳舞,如果是负整数的话,表示这个女孩喜欢和比她低的男孩跳舞。
输出
只有一行一个整数,表示最多的可以搭配的对数。
提示
思路
今天AK了,啦啦啦啦啦(蒟蒻的狂癫)。。。
把男生和女生都分成正和负,那么搭配的话,一定是一边正一边负,然后sort+贪心。。。正数按从大到小,负数按从小到大,存的时候存绝对值
以男正,女负为例
不停搭配后,成
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int male_z[100100],male_f[100100],female_z[100100],female_f[100100],Gun;
//male是男,female是女,z是正,f是负。打这么长,只是为了让我的程序变得高B格一点
int n,male_z_n,female_z_n,male_f_n,female_f_n;
bool cmp(int x,int y){
return x>y;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x>0)male_z[++male_z_n]=x;
else male_f[++male_f_n]=abs(x);
}
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x>0)female_z[++female_z_n]=x;
else female_f[++female_f_n]=abs(x);
}//把正负分开存
sort(male_z+1,male_z+1+male_z_n,cmp);
sort(female_z+1,female_z+1+female_z_n,cmp);
sort(male_f+1,male_f+1+male_f_n);
sort(female_f+1,female_f+1+female_f_n);
for(int j=1,i=male_z_n;j<=female_f_n&&i>0;j++)
if(male_z[i]<female_f[j])--i,Gun++;
for(int j=1,i=female_z_n;j<=male_f_n&&i>0;j++)
if(female_z[i]<male_f[j])--i,Gun++;//贪心
printf("%d",Gun);
}