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 }

 

 

你可能感兴趣的:(2008)