1 条题解

  • 0
    @ 2025-5-6 20:23:06

    初始有 nn 堆石子,每堆石子有 aia_i 个(ai2a_i \ge 2),两人轮流进行操作,一个人每次可以选取一堆石子将其分成两堆石子,并把其中一堆石子染成黑色,另一堆石子染成白色,这两堆石子的个数没有限制,但不能为 0(也即只有 1 个石子的堆是不能被划分的)。当所有堆都只含有 1 个石子时,游戏结束。此时 brz 的得分为白色的石子个数,Mandy 的得分为黑色的石子个数,问两人同等聪明的情况下 brz 先手能获得的分数。

    注:染过色的石子是可以再被染色的。

    关键点是只有 1 个石子的堆是不能被划分的,仔细想想,每次划分只有把 aia_i分成ai1a_i - 111,并把 11 的那堆染成对自己有利的颜色才能获得贡献(因为11不能被划分了,颜色不会变)。更进一步,如果 aia_i 是偶数,那么 11ai1a_i - 1 均为奇数,你的贡献多了 11,别人下次操作 ai1a_i - 1,他的贡献也会多 11,并得到一堆偶数个数的石子,因此偶数个石子的堆是无净贡献的。那么当 aia_i 为奇数时,分成了一堆偶数的和一堆只有 11 的,只有你的贡献会多 11。综上,两人都会优先处理奇数个石子的堆,因此只有初始时这样的堆有奇数个,brz 的得分才会比 Mandy 的得分多 11,否则两人得分一样。

    时间复杂度:O(n)O(\sum n)

    #include <iostream>
    #define endl '\n'
    using namespace std;
    using LL = long long;
    
    void solve(){
    	int n;
    	cin >> n;
    	LL sum = 0;
    	for(int i = 0; i < n; i++){
    		int x;
    		cin >> x;
    		if(x == 1) continue;
    		sum += x;
    	}
    	if(sum % 2 == 1) cout << "win" << endl;
    	else cout << "lose" << endl;
    }
    
    int main(){
    	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    	int T;
    	cin >> T;
    	while(T--){
    		solve();
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    2273
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    (无)
    递交数
    41
    已通过
    20
    上传者