BZOJ1034: [ZJOI2008]泡泡堂BNB

题目描述里的非主流配图…

这道题做法和田忌赛马差不多,先把自己和对手都排个序,只要按照下面的流程走就行了:

  1.尽量用自己最优的干掉对方最优的 ans+=2

  2.尽量用自己最矬的干掉对方最矬的 ans+=2

  3.用自己最矬的一个干掉对方最优的 ans+=(两者是否相同)? 1:0

而自己最坏的情况,只要用对手最优的情况反着来一次。

 1 /**************************************************************
 2     Problem: 1034
 3     User: zhuohan123
 4     Language: C++
 5     Result: Accepted
 6     Time:252 ms
 7     Memory:2132 kb
 8 ****************************************************************/
 9  
10 #include <iostream>
11 #include <cstdio>
12 #include <algorithm>
13 using namespace std;
14 int n,a[110000],b[110000];
15 int main(int argc, char *argv[])
16 {
17     scanf("%d",&n);
18     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
19     sort(a+1,a+n+1);
20     for(int i=1;i<=n;i++)scanf("%d",&b[i]);
21     sort(b+1,b+n+1);
22     int ans=0,al=1,ar=n,bl=1,br=n;
23     while(al<=ar&&bl<=br)
24     {
25         while(a[al]>b[bl]&&al<=ar&&bl<=br)al++,bl++,ans+=2;
26         while(a[ar]>b[br]&&al<=ar&&bl<=br)ar--,br--,ans+=2;
27         if(al<=ar&&bl<=br)ans+=(a[al]==b[br]),al++,br--;
28     }
29     printf("%d ",ans);
30     for(int i=1;i<=n;i++)swap(a[i],b[i]);
31     ans=0,al=1,ar=n,bl=1,br=n;
32     while(al<=ar&&bl<=br)
33     {
34         while(a[al]>b[bl]&&al<=ar&&bl<=br)al++,bl++;
35         while(a[ar]>b[br]&&al<=ar&&bl<=br)ar--,br--;
36         if(al<=ar&&bl<=br)ans+=(a[al]==b[br])?1:2,al++,br--;
37     }
38     printf("%d\n",ans);
39     return 0;
40 }

 

 

posted @ 2013-08-10 18:48  zhuohan123  阅读(359)  评论(0编辑  收藏  举报