• 具体一些的博弈论 sqrstone


    Description
    你有n个盒子用来放石头,每个盒子都有最大容量与初始的石头数,
    两个人轮流放石头,每次必须选择一个盒子往里放数量不超过当前盒子中石头数的平方的石头
    比如一个盒子当前有3个石头,你可以放1~9个石头,当然不能超过容量限制
    谁先不能放石头谁就输了,问先手输赢
    Input
    包含多组数据,每组数据第一行一个整数n表示盒子数,接下来n行每行两个非负整数s和c,
    表示盒子的容量和初始石头数,n=0时表示读入结束
    Output
    除了n=0的数据外每个数据输出’Yes’或’No’分别表示先手赢和输
    Sample Input
    样例输入:

    3
    2 0
    3 3
    6 2
    2
    6 3
    6 3
    0

    样例输出:

    Yes
    No
    HINT
    数据范围:

    对于30%的数据 n < 5 s, c < 10
    对于60%的数据 n < 20 s, c < 1000 数据组数 < 11
    对于100%的数据 n < 50 s, c < 1000000 数据组数 < 1001


    SG函数.
    直接暴力搞能拿到40分, 稍作优化即可AC.
    设t满足 t * t + t < s, (t + 1) * (t + 1) + (t + 1) >= s
    1. c > t 则当前状态是必胜态,因为c*c+c>=s成立,返回sg值为s-c(因为当前有c个可以选石头到当前有(c+1) ~ s个状态,当前s个状态必败sg值为0,(c + 1)到(s - 1)的状态sg值求法同理)
    2. c = t 则当前状态为必败态,因为最多放c * c个石头,瓶子未满,对手必胜,至少放1个石头,则对手也是必胜.
    3. c < t 当前状态无法确定,而在瓶子中已经有c个石头的前提下,容量为 s 和容量为 t 的状态是等价的,如果(t, c)是必败态,则(s, c)也是必败态.

  • 相关阅读:
    python学习之第二课时--运行程序和字符编码
    python学习之前言
    一天一道算法题--6.14--思维题
    TOJ--2119--最小生成树和map
    NOJ--1046--dfs
    TOJ--1343--dfs
    一天一道算法题--6.13---计算几何
    一天一道算法题---6.12---链表结点的删除
    TOJ--1114--rmq/线段树
    TOJ--1278--最小生成树
  • 原文地址:https://www.cnblogs.com/ZeonfaiHo/p/6402846.html
Copyright © 2020-2023  润新知