Luogu - CF257B 【Playing Cubes】 - 題解
阿新 • • 發佈:2020-08-23
題目翻譯:
有 \(n\) 個紅方塊和 \(m\) 個藍方塊 \((n,m \le 10^5)\),現在\(A\) 和 \(B\) 兩個人輪流搭方塊 \((A\) 先手 \()\),如果上下兩個方塊顏色相同,則 \(A\) 得一分,否則 \(B\) 得一分。問 \(A\) , \(B\) 的最大可能得分分別是多少。
思路:
很顯然:
對於 \(A\),放與上次相同顏色的方塊一定更優。
對於 \(B\),放與上次不同顏色的方塊一定更優。
綜合上述結論,我們開始分析。
對於 \(A\),一直到選了 \(\min(n,m) \times 2\) 個方塊時,每次 \(A\) 都只有自己的放置能得一分,所以此時 \(A\)
在這之後,由於只剩下一種顏色,所以不論誰放都是 \(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\)
對於 \(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; }