A. Everything Nim

https://codeforces.com/problemset/problem/1965/A

题意:给定n堆石子,Alice和bob每次操作可以选择一个k,k不能超过石子堆中最短的一堆的高度,随后将所有的石子堆的高度都减去k,一直操作下去,直到有人无法继续操作,该人失败,alice先手,问都play optimial,谁会赢。

思路:首先考虑最大未出现的数mex,如果mex==maxn + 1,说明数组是一个permutation,那么就看数组的长度,如果是奇数,alice赢。第二种可能,mex <= maxn,也就是说,在经过了一系列的permutain数组后,还有一些数,这个时候,就看经历过permutaion数组的操作后,是谁先手,先手者赢,于是permutaion的长度是mex-1,该长度如果是偶数,alice先手,赢。

总结:题目咋越来越绕,越来越难了,还是人越来越菜了??

inline void solve() {
	int n;
	cin >> n;

	vector<int> a(n);
	for (auto& x : a) {
		cin >> x;
	}

	sort(a.begin(), a.end());
	a.erase(unique(a.begin(), a.end()), a.end());
	n = (int)a.size();

	int maxn = a.back();

	int mex = 1;
	for (int i = 0; i < n; ++i) {
		if (a[i] == mex) {
			mex ++;
		}
		else {
			break;
		}
	}

	bool alice = true;
	if (mex > maxn) {
		alice = ((n & 1 ? true : false));
	}
	else if (mex > 1) {
		alice = (mex & 1 ? true : false);
	}

	cout << (alice ? "Alice\n" : "Bob\n");
}
posted @ 2025-08-01 09:31  _Yxc  阅读(7)  评论(0)    收藏  举报