题目翻译:
有 (n) 个红方块和 (m) 个蓝方块 ((n,m le 10^5)),现在(A) 和 (B) 两个人轮流搭方块 ((A) 先手 ()),如果上下两个方块颜色相同,则 (A) 得一分,否则 (B) 得一分。问 (A) , (B) 的最大可能得分分别是多少。
思路:
很显然:
对于 (A),放与上次相同颜色的方块一定更优。
对于 (B),放与上次不同颜色的方块一定更优。
综合上述结论,我们开始分析。
对于 (A),一直到选了 (min(n,m) imes 2) 个方块时,每次 (A) 都只有自己的放置能得一分,所以此时 (A) 的得分为 (min(n,m))。
在这之后,由于只剩下一种颜色,所以不论谁放都是 (A) 得分,所以此时 (A) 的得分为
(min(n,m) + ((n+m)-min(n,m) imes 2))
化简后就是 (max(n,m))
又因为 (A) 是先手,所以首次放置一定不得分,所以还要减一,即 (max(n,m) -1)。
对于 (B),由于最多也就 (min(n,m)) 种不同颜色的可能,而且只要每次放与上次不同的颜色,这所有的可能都一定会出现,所以 (B) 的最大的分就是 (min(n,m))。
综上所述:
对于 (A),答案为 (max(n,m) -1) 。
对于 (B),答案为 $min(n,m) $。
Code:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<bitset>
#include<cmath>
#include<queue>
#include<map>
#include<set>
using namespace std;
int read()
{
int ans=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
return ans*f;
}
int n,m;
int main()
{
n=read();m=read();
printf("%d %d",max(n,m)-1,min(n,m));
//分析了那么久,核心代码就这一行
return 0;
}