BZOJ 1034 [ZJOI2008]泡泡堂BNB

题目链接

思路

看到数据规模这么大,还是要求最优解,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\n",solve(a,b),2*n-solve(b,a));
36     return 0;
37 }

猜你喜欢

转载自www.cnblogs.com/rlt1296/p/9379011.html