CF257B 【Playing Cubes】

题目翻译:

\(n\) 个红方块和 \(m\) 个蓝方块 \((n,m \le 10^5)\),现在\(A\)\(B\) 两个人轮流搭方块 \((A\) 先手 \()\),如果上下两个方块颜色相同,则 \(A\) 得一分,否则 \(B\) 得一分。问 \(A\) , \(B\) 的最大可能得分分别是多少。

思路:

很显然:
对于 \(A\),放与上次相同颜色的方块一定更优。
对于 \(B\),放与上次不同颜色的方块一定更优。

综合上述结论,我们开始分析。

对于 \(A\),一直到选了 \(\min(n,m) \times 2\) 个方块时,每次 \(A\) 都只有自己的放置能得一分,所以此时 \(A\) 的得分为 \(\min(n,m)\)
在这之后,由于只剩下一种颜色,所以不论谁放都是 \(A\) 得分,所以此时 \(A\) 的得分为
\(\min(n,m) + ((n+m)-\min(n,m) \times 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;
}
posted @ 2020-08-23 19:49  Blackbird137  阅读(175)  评论(0编辑  收藏  举报