- 题意:两个队的出场顺序你来安排 ,你希望一方获胜,怎么安排最优?
- 解:
做n轮决策:
- 1、我方最菜和敌方最菜相比 ***能赢就打***
- 2、否则我方最强和敌方最强相比 ***能赢就打***
- 3、否则用自己最菜打对方最强
前两条很容易理解,第三条的理解:
第三条在 (最菜==最菜 最强==最强)时我不是很理解
(这种情况下明显最优的情况是在双方 a[k]==b[k] 的情况下绝对成立的)
:(困惑)我总想在**这时候**用最强打最强最弱打最弱--->
(其实就算最弱的丢了分,但是我们前面强的绝对有更多的机会把分补回来,如果没有机会说明这个现在丢的分你就算是安排最强打最强最弱打最弱也一样会丢出去的)
#include<bits/stdc++.h>
#define en '\n'
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) (a>b? a:b)
#define ll long long
using namespace std;
const int maxn=112345;
int n,a[maxn],b[maxn];
int sol(int x[],int y[]){
int l1,l2,r1,r2,ans=0;
l1=l2=1;r1=r2=n;
int T=n;
while(T--){
if(x[r1]>y[r2]){
r1-=1,r2-=1;
ans+=2;
}
else if(x[l1]>y[l2]){
ans+=2;l1+=1,l2+=1;
}
else{
ans+=(x[l1]==y[r2]);
l1+=1,r2-=1;
}
}return ans;
}
signed main() {
#ifdef local
freopen("input2.txt","r",stdin);
#endif // local
cin>>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+1+n);
sort(b+1,b+1+n);
printf("%d %d",sol(a,b),2*n-sol(b,a));
return 0;
}