//总体思路就是1.最小的一定是要比赛的所以我们从最小的考虑气走2.考虑田忌赛马的策略是本题关键
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[100001], b[100001];
int getmax(int *a, int *b)
{
int l = 1;
int r = n;
int ll = 1;
int rr = n;
int ans = 0;
while (l <= r)
{
if (a[l]>b[ll])//如果大于直接用小的赢了节省
{
ans += 2;
l++;
ll++;
continue;
}
if (a[l]<b[ll])//最小的一定赢不了了破罐破摔打最大的消耗对方
{
l++;
rr--;
continue;
}
if (a[l] == b[ll])
{
if (a[r]>b[rr])//这里为社么不让两个小的打考虑到有可能后面存在a[r]<=b[rr]的情况
{
ans += 2;
r--;
rr--;
}
else
{
ans += (a[l] == b[rr]);//若a[r]==b[rr]那么我们让a[l]打b[rr]这时的局面一定是比a[l]打b[l]好的而且分数也不会低
l++;//若a[r]<b[rr]那么我们让a[l]打b[rr]这时因为b[rr]已经不可战胜所以我们破罐破摔
rr--;
continue;
}
}
}
return ans;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &b[i]);
sort(a + 1, a + n + 1);
sort(b + 1, b + n + 1);
int all = 2 * n;
int ansmax = getmax(a, b);
int ansmin = getmax(b, a);
printf("%d %d\n", ansmax, all - ansmin);
}
bzoj1034
最新推荐文章于 2019-09-18 16:37:00 发布