洛谷P2587 [ZJOI2008] 泡泡堂

Posted H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P2587 [ZJOI2008] 泡泡堂相关的知识,希望对你有一定的参考价值。

  题目传送门

  分析:一道策略游戏题,要求最大期望得分和最小期望得分。首先分析最大,很显然是可以用一种类似于田忌赛马的思维来做,将两队的实力按照从大到小(其实从小到大也可以)排序,然后就按照顺序比较,可能会出现以下几种情况:

  我方最大>对方最大,则用我方最大对抗对方最大

  我方最小>对方最小,则用我方最小对抗对方最小

  如果以上两种情况都不满足,则用我方最小去对抗对方最大,为我方最大争取机会。

  这个正确性应该不难证明,那么最大的得分就这么A(shui)掉了;

  再看最小得分,发现直接求最小得分并不容易,那么转换一下思维,求最大失分,再用2n-最大失分,正确性易证。那么求最大失分思维就和上面一样,只需转换一下:

  我方最大<对方最大,则用我方最大对抗对方最大

  我方最小<对方最小,则用我方最小对抗对方最小

  如果以上两种情况都不满足,则比较我方最大与对方最小,如果相等,则失一分,否则不失分。

  然后,这题就这样水过去了!

  Code:

  

技术分享图片
 1 //It is made by HolseLee on 7th Apr 2018
 2 //Luogu.org P2587
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<iostream>
 8 #include<iomanip>
 9 #include<algorithm>
10 using namespace std;
11 const int N=1e5+7;
12 int n,a[N],b[N];
13 int ans,hm,tm,he,te;
14 inline int read()
15 {
16   char ch=getchar();int num=0;bool flag=false;
17   while(ch<0||ch>9){if(ch==-)flag=true;ch=getchar();}
18   while(ch>=0&&ch<=9){num=num*10+ch-0;ch=getchar();}
19   return flag?-num:num;
20 }
21 bool cmp(int x,int y)
22 {return x>y;}
23 int main()
24 {
25   n=read();
26   for(int i=1;i<=n;i++)
27     a[i]=read();
28   for(int i=1;i<=n;i++)
29     b[i]=read();
30   sort(a+1,a+n+1,cmp);
31   sort(b+1,b+n+1,cmp);
32   tm=te=n;hm=he=1;
33   while(hm<=tm){
34     if(a[hm]>b[he])ans+=2,hm++,he++;
35     else if(a[tm]>b[te])ans+=2,tm--,te--;
36     else ans+=(a[tm]==b[he]),he++,tm--;}
37   printf("%d ",ans);
38   hm=he=1;tm=te=n;ans=0;
39   while(hm<=tm){
40     if(a[hm]<b[he])ans+=2,hm++,he++;
41     else if(a[tm]<b[te])ans+=2,tm--,te--;
42     else ans+=(a[hm]==b[te]),hm++,te--;}
43   printf("%d",2*n-ans);
44   return 0;
45 }
View Code

 

以上是关于洛谷P2587 [ZJOI2008] 泡泡堂的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1034 [ZJOI2008]泡泡堂BNB

bzoj 1034 [ZJOI2008]泡泡堂BNB(贪心)

BZOJ 1034 [ZJOI2008]泡泡堂BNB

[BZOJ1034][ZJOI2008]泡泡堂BNB 贪心

[ZJOI2008]泡泡堂

bzoj1034: [ZJOI2008]泡泡堂BNB