这题前三段都是一堆吹爆赞助商的屁话,正式题目在图片下边,一个简单模拟题。
题目大意:
有n个男生,m个女生在进行舞会,其中一部分男生祥和比自己矮的女生跳舞,一部分男生想和比自己高的女生跳舞,一部分女生想和比自己高的男生跳舞,一部分女生想和比自己矮的男生跳舞;
所以,我们可以这样配对:想跟比自己矮的女生跳舞的男生——想跟比自己高的男生跳舞的女生;想跟比自己高的女生跳舞的男生——想跟比自己矮的男生跳舞的女生。
分组,排序,扫描配对,完事。(不过比赛中某人把代码里的n,m搞错了,从开头debug到封榜才找到bug)
代码如下:
1 #include<iostream> 2 #include<algorithm> 3 #include<memory.h> 4 #include<stdio.h> 5 #define max 1000005 6 using namespace std; 7 long long int man[max],woman[max],a1[max],a2[max],b1[max],b2[max]; 8 int main(){ 9 int t; 10 scanf("%d",&t); 11 while(t--){ 12 int n,m,x=0,y=0,j=0,k=0,ans=0; 13 bool vis; 14 memset(man,0,sizeof(man)); 15 memset(woman,0,sizeof(woman)); 16 memset(a1,0,sizeof(a1)); 17 memset(a2,0,sizeof(a2)); 18 memset(b1,0,sizeof(b1)); 19 memset(b2,0,sizeof(b2)); 20 scanf("%d %d",&n,&m); 21 for(int i=0;i<n;i++){ 22 scanf("%lld",&man[i]); 23 } 24 for(int i=0;i<m;i++){ 25 scanf("%lld",&woman[i]); 26 } 27 for(int i=0;i<n;i++){ 28 cin>>vis; 29 if(vis){ 30 a1[j]=man[i]; 31 j++; 32 } 33 else{ 34 a2[k]=man[i]; 35 k++; 36 } 37 } 38 for(int i=0;i<m;i++){ 39 cin>>vis; 40 if(vis){ 41 b1[x]=woman[i]; 42 x++; 43 } 44 else{ 45 b2[y]=woman[i]; 46 y++; 47 } 48 } 49 sort(a1,a1+j); 50 sort(a2,a2+k); 51 sort(b1,b1+x); 52 sort(b2,b2+y); 53 for(int i=0,z=0;i<j;i++){ 54 while(a1[i]>b2[z]&&z<y){ 55 z++; 56 } 57 if(z>=y){ 58 break; 59 } 60 ans++; 61 z++; 62 } 63 for(int i=0,z=0;i<x;i++){ 64 while(b1[i]>a2[z]&&z<k){ 65 z++; 66 } 67 if(z>=k){ 68 break; 69 } 70 ans++; 71 z++; 72 } 73 printf("%d ",ans); 74 } 75 }