洛谷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 }
以上是关于洛谷P2587 [ZJOI2008] 泡泡堂的主要内容,如果未能解决你的问题,请参考以下文章