【贪心】PLES

题目描述

在舞会上有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);
}
发布了45 篇原创文章 · 获赞 0 · 访问量 377

猜你喜欢

转载自blog.csdn.net/qq_39940018/article/details/102752605