The 19th Zhejiang University Programming Contest Sponsored by TuSimple (Mirror)
比赛地址:点击传送
Problem A-Thanks, TuSimple!
题目地址:点击传送
-----------------------------------------------
碎碎念:题目图片前所有文字都是废话...刚开始看见A题直接跳了....
后来做了两题挂机(无能为力)...看到A题的榜好像不错...蛮简单的额...但是我一直WA和TLE
---------------
解析:
题意:举办派对,不同身高(无相同)男士和女士去跳舞,0表示会与较矮的异性跳,1表示会与较高的异性跳。
问你最多有多少对舞伴。
把四种人放在四个独立的数组并按身高排序,然后数组男0和女1,男1和女0两次计算。
重点是!!!遍历的时候j不需要每次都从0开始....(已经排好序了 依次匹配就好)
附上丑代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
long long a[100005],b[100005];
long long man1[100005],man0[100005],woman0[100005],woman1[100005];
int vis1[100005],vis2[100005];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
int n,m,x;
int m1=0,m0=0,w1=0,w0=0,cnt=0;
scanf("%d%d",&n,&m);
int i,j;
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
for(i=0;i<m;i++)
scanf("%lld",&b[i]);
for(i=0;i<n;i++)
{
scanf("%d",&x);
if(x)
man1[m1++]=a[i];
else man0[m0++]=a[i];
}
for(i=0;i<m;i++)
{
scanf("%d",&x);
if(x)
woman1[w1++]=b[i];
else woman0[w0++]=b[i];
}
sort(man1,man1+m1,cmp);
sort(man0,man0+m0,cmp);
sort(woman1,woman1+w1,cmp);
sort(woman0,woman0+w0,cmp);
//开始计算答案
for(i=j=0;i<m0;i++)
{
for(;j<w1;j++)
{
if(man0[i]>woman1[j]&&!vis1[j])
{
cnt++,vis1[j]=1;
break;
}
}
}
for(i=j=0;i<w0;i++)
{
for(;j<m1;j++)
{
if(woman0[i]>man1[j]&&!vis2[j])
{
cnt++;
break;
}
}
}
printf("%d\n",cnt);
}
return 0;
}