1. 程式人生 > 實用技巧 >Luogu - CF257B 【Playing Cubes】 - 題解

Luogu - 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;
}