Codeforces 1161C(博弈)

自己的一点想法

  • 举几个例子后发现是谁先手痒痒把某一堆掏空了那他就GG了,因此要尽量让对方不得不掏空某堆。
  • 用最简单的举例后发现:1 1 1 1 1 1,扔给谁谁完蛋;1 1 1 1 1 2,一样的,肯定得动1的部分;1 1 1 1 2 2,还是败;1 1 1 2 2 2,这个就不一样了,这是胜局面,因为可以不必动1,而且将败局面1 1 1 1 1 1扔给对方。至此可以对要使用的策略有模糊的认知。
  • 考虑更常规的:1 2 3 4 5 6,怎么丢给对方差局面?抓2 3 4,使其变成1 1 1 1 5 6,会发现这和1 1 1 1 2 2其实是一样的结局;10 10 20 20 30 30,如果根据之前的认知直观感受,我们抓20 20 30的,变成10 10 10 10 10 30扔给对手,这个情况和1 1 1 1 1 3一样吗?一样。因为对手必须得动最小的那一堆,他这次虽然没有归0,比如变成10 10 10 9 9 29(最后一个随意辣),但我方此时就9 9 9 9 9 29,所以就是赢的。
  • 非要较真,就不拿20 20 30的,就要拿10 10 30呢……比如变成9 9 20 20 30 29,那对方就可以下黑手了,将其变成9 9 9 9 9 30,你输了。
  • 综上,其实这个博弈的结果一开始就是定好了的,如果与最小的不同的数量小于n / 2,则先手败,否则先手胜。
int n, a[55];

int main() {
	cin >> n;
	rep(i, 0, n - 1)	cin >> a[i];
	sort(a, a + n);
	int dif = 0;
	rep(i, 1, n - 1)
		if (a[i] != a[0])
			dif++;
	if (dif < n / 2)	puts("Bob");
	else	puts("Alice");
	return 0;
}
posted @ 2019-06-02 00:17  AlphaWA  阅读(159)  评论(0编辑  收藏  举报