【jzoj4825】【舞会配对】【贪心】

19 篇文章 0 订阅

题目大意

在舞会上有N个男孩和N个女孩,每个人都量过了自己的身高。每个男孩只跟女孩跳舞,并且女孩也只跟男孩跳舞。每个人最多只有一个舞伴。男孩或者想和比自己高的女孩跳舞,或者想和比自己低的女孩跳舞,同样的,女孩也是或者想和比自己高的男孩跳舞,或者想和比自己低的男孩跳舞。你能决定最多有多少对能在一起跳舞吗?

解题思路

将喜欢高的标记为正,喜欢低的标记为负,排序之后贪心地取。

code

#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define LD double
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a>b)?b:a)
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
int const inf=2147483647;
int const maxn=100000;
int n,a[maxn+10],b[maxn+10];
int main(){
    freopen("ples.in","r",stdin);
    freopen("ples.out","w",stdout);
    scanf("%d",&n);
    fo(i,1,n)scanf("%d",&a[i]);
    fo(i,1,n)scanf("%d",&b[i]);
    sort(a+1,a+n+1);
    sort(b+1,b+n+1);
    int ans=0;
    for(int i=1,j=n;a[i]<0;i++){
        for(;j&&(b[j]>0)&&(b[j]>=-a[i]);j--);
        if(j&&(b[j]>0)&&(b[j]<-a[i])){ans++;j--;}
    }
    for(int i=1,j=n;b[i]<0;i++){
        for(;j&&(a[j]>0)&&(a[j]>=-b[i]);j--);
        if(j&&(a[j]>0)&&(a[j]<-b[i])){ans++;j--;}
    }
    printf("%d",ans);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值