挺水的一道贪心,显然的思路肯定是要排序的,然后我们首先肯定是能赢则赢,不能赢就平
那么当前最大若能打败对方最大那就肯定要打败,因为排好序,留着只会打败更小
当前最小能打败对方最小也肯定要打败,因为他不可能留着打败大的
上面两种都不行,就考虑让本方小值去和对方打平手
然后最小值的情况只需要给对方求最大就好
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=205000;
int n,ans,que;
int aba[M],abb[M];
inline int read()
{
int x=0;char ch=getchar();
while (ch>'9'||ch<'0') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
signed main()
{
n=read();int la=1,lb=1,ra=n,rb=n;
for (int i=1;i<=n;i++) aba[i]=read();
for (int i=1;i<=n;i++) abb[i]=read();
sort(aba+1,aba+n+1);sort(abb+1,abb+n+1);
for (int i=1;i<=n;i++)
{
if (aba[ra]>abb[rb]) ans+=2,ra--,rb--;//最大可以打过最大
else if (aba[la]>abb[lb]) ans+=2,la++,lb++;//最小可以打过最小
else ans+=(aba[la]==abb[rb]),la++,rb--; //看看是不是小值可以打平
}
la=lb=1;rb=ra=n;
for (int i=1;i<=n;i++)
{
if (abb[ra]>aba[rb]) que+=2,ra--,rb--;//最大可以打过最大
else if (abb[la]>aba[lb]) que+=2,la++,lb++;//最小可以打过最小
else que+=(abb[la]==aba[rb]),la++,rb--; //看看是不是小值可以打平
}
cout<<ans<<" "<<(2*n-que);
return 0;
}