ZOJ4090 Thanks To Simple(思维)

题意:

给出男生的人数,女生的人数,和每个人的身高和喜好。

有些男生喜欢高的女生,有些男生喜欢矮的女生,女生也一样。

只能在异性之间进行配对,询问最多能配对几对。

题解:

开四个数组分别存储四种人,只能喜好不同的异性才能配对,用双下标法配对两次即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+15;
int a[maxn];
int b[maxn];
vector<int> v1;//喜欢比自己矮的女生 
vector<int> v2;//喜欢比自己高的女生 
vector<int> v3;//喜欢比自己矮的男生 
vector<int> v4;//喜欢比自己高的男生 
int T;
int N,M;
int p[maxn];
int main () {
    scanf("%d",&T);
    while (T--) {
        scanf("%d%d",&N,&M);
        for (int i=1;i<=N;i++) 
            scanf("%d",&a[i]);
        for (int i=1;i<=M;i++)
            scanf("%d",&b[i]);
        v1.clear();
        v2.clear();
        v3.clear();
        v4.clear();
        for (int i=1;i<=N;i++) {
            scanf("%d",&p[i]);
            if (p[i]==0) 
                v1.push_back(a[i]);
            else 
                v2.push_back(a[i]); 
        }
        for (int i=1;i<=M;i++) {
            scanf("%d",&p[i]);
            if (p[i]==0)
                v3.push_back(b[i]);
            else 
                v4.push_back(b[i]);
        }
        int ans=0;
        sort(v1.begin(),v1.end());
        sort(v4.begin(),v4.end());
        for (int i=0,j=0;i<v1.size()&&j<v4.size();) {
            if (v1[i]>v4[j]) {
                ans++;
                i++,j++;
            }
            else i++;
        }
        sort(v2.begin(),v2.end());
        sort(v3.begin(),v3.end());
        for (int i=0,j=0;i<v2.size()&&j<v3.size();) {
            if (v3[j]>v2[i]) {
                ans++;
                i++,j++;
            }
            else j++;
        }
        printf ("%d
",ans);
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/zhanglichen/p/12506120.html