[博弈]Atcoder AGC002 E. Candy Piles

本文介绍了一种使用SG函数解决特定博弈问题的方法。通过将操作映射为坐标平移,利用SG函数来确定玩家的胜负。文章提供了一个具体的算法实现案例,包括输入输出处理及关键逻辑的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把A排序一遍,设刚开始在(0,0)点,那么操作一相当于右移,操作二相当于上移,这就可以用SG函数来解决。

边界的SG值为0,而且可以证明(x,y)的SG值和(x+1,y+1)的SG值相同,但是(x+1,y+1)不是边界

那么x,y同时加1,直到到达边界之前,然后算一下就好了。

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

const int N=100010;

int n,a[N];

int main(){
  freopen("1.in","r",stdin);
  freopen("1.out","w",stdout);
  scanf("%d",&n);
  for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  sort(a+1,a+1+n,greater<int>());
  int p=0;
  while(p+1<n && p+1<a[p+2]) p++;
  int A=(a[p+1]-p)&1,B=1;
  for(int i=p+2;i<=n && a[i]>p;i++) B^=1;
  if(A && B) puts("Second"); else puts("First");
  return 0;
}
尼姆博弈是一种经典的数学博弈游戏,通常由两玩家进行。每个玩家轮流从一堆物品中取走任意数量的物品,最后一个取走物品的玩家获胜。为了编写一个尼姆博弈的代码,我们需要实现以下功能: 1. **初始化游戏**:定义初始的物品数量。 2. **玩家轮流取物品**:每个玩家可以选择从一堆物品中取走任意数量的物品。 3. **判断胜利条件**:当所有物品被取完时,最后一个取走物品的玩家获胜。 下面是一个简单的Python代码示例,展示了如何实现尼姆博弈: ```python def nim_game(piles): """ Nim游戏的主函数 :param piles: 初始的物品堆,每堆的物品数量 :return: 胜利的玩家,1或2 """ current_player = 1 while True: print(f"当前堆状态: {piles}") print(f"玩家 {current_player} 的回合") move = get_player_move(piles) piles = update_piles(piles, move) if is_game_over(piles): print(f"玩家 {current_player} 获胜!") break current_player = switch_player(current_player) def get_player_move(piles): """ 获取玩家的移动 :param piles: 当前堆的状态 :return: 玩家的移动,列表形式 """ while True: try: move = list(map(int, input("请输入你要取的每堆物品数量,用空格分隔: ").split())) if len(move) != len(piles): print(f"请输入 {len(piles)} 个数字") continue if any(x < 0 or x > pile for x, pile in zip(move, piles)): print("无效的输入,请重新输入") continue return move except ValueError: print("请输入有效的数字") def update_piles(piles, move): """ 更新堆的状态 :param piles: 当前堆的状态 :param move: 玩家的移动 :return: 更新后的堆的状态 """ return [pile - move[i] for i, pile in enumerate(piles)] def is_game_over(piles): """ 判断游戏是否结束 :param piles: 当前堆的状态 :return: 布尔值 """ return all(pile == 0 for pile in piles) def switch_player(current_player): """ 切换当前玩家 :param current_player: 当前玩家 :return: 切换后的玩家 """ return 2 if current_player == 1 else 1 if __name__ == "__main__": initial_piles = list(map(int, input("请输入每堆物品的初始数量,用空格分隔: ").split())) nim_game(initial_piles) ``` 这个代码实现了以下功能: 1. 初始化游戏:用户输入每堆物品的初始数量。 2. 玩家轮流取物品:每个玩家输入要取走的每堆物品数量。 3. 判断胜利条件:当所有物品被取完时,游戏结束,最后一个取走物品的玩家获胜。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值