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

题目大意

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

解题思路

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

code

#include
#include
#include
#include
#include
#include
#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;
}

你可能感兴趣的:(jzoj,贪心)