思路
看到数据规模这么大,还是要求最优解,dp会炸,只能考虑贪心,所以先排序。
之后,我就想逐位比较,比不过就与下一个比,但是应不应该平就不是很会处理。
苟且地看了一眼题解,发现可以运用田忌赛马的思想,先看己方最差的是否强于对方最差的,若是,得分。
再看己方最强的是否强于对方最强的,若是,得分。
否则就用己方最差的与对方最差的比,输了也不亏。
最优解处理完了,最差解就是对方最优解的情况,由于总分一定是2*n,减一下就好了。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdio> 4 using namespace std; 5 const int N=100005; 6 int n,a[N],b[N]; 7 int solve(int a[],int b[]) 8 { 9 int s1,s2,e1,e2,ans; 10 s1=s2=1,e1=e2=n,ans=0; 11 while(s1<=e1&&s2<=e2) 12 { 13 if(a[s1]>b[s2]) 14 ans+=2,s1++,s2++; 15 else if(a[e1]>b[e2]) 16 ans+=2,e1--,e2--; 17 else 18 { 19 if(a[s1]==b[e2]) 20 ans++; 21 s1++,e2--; 22 } 23 } 24 return ans; 25 } 26 int main() 27 { 28 scanf("%d",&n); 29 for(int i=1;i<=n;i++) 30 scanf("%d",a+i); 31 for(int i=1;i<=n;i++) 32 scanf("%d",b+i); 33 sort(a+1,a+n+1); 34 sort(b+1,b+n+1); 35 printf("%d %d ",solve(a,b),2*n-solve(b,a)); 36 return 0; 37 }