题意:
给出男生的人数,女生的人数,和每个人的身高和喜好。
有些男生喜欢高的女生,有些男生喜欢矮的女生,女生也一样。
只能在异性之间进行配对,询问最多能配对几对。
题解:
开四个数组分别存储四种人,只能喜好不同的异性才能配对,用双下标法配对两次即可。
#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; }