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;
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。