正题
看到这种能力值比较地题目,就很容易会想到田忌赛马。
首先两边都按从小到大排序,接着如果我方的第一个选手的能力值高于对方的第一个选手,那么就给答案加二。
如果没有,我们看一下当前我方的最后一个选手,如果能力值高于对方的最后一个的话,那么答案也是加上二。
第一个显然是正确的,第二个我们考虑一下假如我们不这样比的话,我们最大的就浪费了。
所以这两种贪心都是很正确的。
如果都不满足,那么我们就把我们的第一个跟对方的最后一个换掉,来达到最大价值。
最小的情况,显然此时对面得分最高,所以倒过来做一遍最大的,减一减就好了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[100010],b[100010];
int solve(int*a,int*b){
int ans=0;
int l1=1,r1=n,l2=1,r2=n;
while(l1<=r1 && l2<=r2){
if(a[l1]>b[l2]) l1++,l2++,ans+=2;
else if(a[r1]>b[r2]) r1--,r2--,ans+=2;
else ans+=(a[l1]==b[r2]),l1++,r2--;
}
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+1+n);
sort(b+1,b+1+n);
printf("%d %d",solve(a,b),2*n-solve(b,a));
}