博客
关于我
P1288 取数游戏II
阅读量:229 次
发布时间:2019-02-28

本文共 2106 字,大约阅读时间需要 7 分钟。

对于给定的数组 a1, a2, a3, ..., an,我们需要判断在特定规则下,谁会获胜。规则是:玩家从数组的两端开始交替取值,每次取值时必须满足当前值不为零。如果玩家无法取值,则输掉游戏。

解题思路

这个问题可以通过分析数组的长度和元素的分布来解决。具体来说,我们需要考虑以下两种情况:

  • 长度为偶数的情况:

    • 如果数组长度为偶数,那么先手玩家有必胜策略。原因在于,先手玩家可以通过从对面端开始取值的方式,逐步逼近对方,最终迫使对方无法取值。
  • 长度为奇数的情况:

    • 如果数组长度为奇数,那么后手玩家有必胜策略。原因在于,后手玩家可以利用对称性和先手的局限性,迫使先手在某一步无法继续游戏。
  • 需要注意的是,由于这是一个环形结构,需要同时考虑从两端开始取值的双向压迫情况。

    代码逻辑

    #include 
    using namespace std;typedef long long ll;typedef long double lf;typedef unsigned long long ull;typedef pair
    P;const int inf = 0x7f7f7f7f;const ll INF = 1e16;const int N = 1e3 + 10;const ull base = 131;const int mod = 998244353;inline int read() { int x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f;}inline string readstring() { string str; char s = getchar(); while (s == ' ' || s == '\n' || s == '\r') { s = getchar(); } while (s != ' ' && s != '\n' && s != '\r') { str += s; s = getchar(); } return str;}int random(int n) { return (int)(rand() * rand()) % n;}void writestring(string s) { int n = s.size(); for (int i = 0; i < n; i++) { printf("%c", s[i]); }}bool is_prime(int n) { if (n < 2) return false; for (int i = 2; i * i <= n; i++) { if (n % i == 0) return false; } return true;}int a[N];int main() { int n = read(); for (int i = 1; i <= n; i++) { a[i] = read(); } int ret = 0; for (int i = 1; i <= n; i++) { ret += 1; if (a[i] == 0) break; } if (ret % 2 == 0) { puts("YES"); return 0; } ret = 0; for (int i = n; i >= 1; i--) { ret += 1; if (a[i] == 0) break; } if (ret % 2 == 0) { puts("YES"); return 0; } puts("NO"); return 0;}

    解释

  • 输入处理:

    • 读取输入数据,解析出数组的长度 n 和数组元素 a。
  • 计算先手获胜次数:

    • 从左到右依次检查数组元素,直到遇到零为止,统计需要的步数。如果步数为偶数,先手玩家获胜。
  • 计算后手获胜次数:

    • 从右到左依次检查数组元素,直到遇到零为止,统计需要的步数。如果步数为偶数,后手玩家获胜。
  • 结果判断:

    • 如果先手或后手的步数均为偶数,输出 "YES";否则输出 "NO"。
  • 通过这种逻辑判断,我们可以快速确定游戏的胜者。

    转载地址:http://ekqp.baihongyu.com/

    你可能感兴趣的文章
    python列出当前目录、子目录和文件的脚本
    查看>>
    python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
    查看>>
    Python切片对象和__getitem__
    查看>>
    python+flask计算机毕业设计高校体育竞赛成绩管理系统的设计与实现(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体育赛事系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体育运动会比赛系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校危化品管理系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校团委事务管理系统(程序+开题+论文)
    查看>>
    Python切片(%s)
    查看>>
    python+flask计算机毕业设计高校学生选课系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校学生饮食推荐系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校教务管理系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校教学档案管理系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校教学督导平台(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校数字化迎新系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校校内景点平台(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校校园线上跳蚤市场的系统设计(程序+开题+论文)
    查看>>
    Python图形处理
    查看>>
    python+flask计算机毕业设计高校物品使用互益平台的设计与实现(程序+开题+论文)
    查看>>