zoukankan      html  css  js  c++  java
  • 取球博弈

    两个人玩取球的游戏。
    一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目。

    • 如果无法继续取球,则游戏结束。
    • 此时,持有奇数个球的一方获胜。
    • 如果两人都是奇数,则为平局。

    假设双方都采用最聪明的取法, 第一个取球的人一定能赢吗? 试编程解决这个问题。

    输入格式:

    第一行3个正整数n1 n2 n3,空格分开,表示每次可取的数目 (0<n1,n2,n3<100)
    第二行5个正整数x1 x2 ... x5,空格分开,表示5局的初始球数(0<xi<1000)

    输出格式:

    一行5个字符,空格分开。分别表示每局先取球的人能否获胜。 能获胜则输出+, 次之,如有办法逼平对手,输出0, 无论如何都会输,则输出-

    输入样例:

    1 2 3
    1 2 3 4 5
    

    样例输出:

    + 0 + 0 -
    

    输入样例:

    1 4 5
    10 11 12 13 15
    

    样例输出:

    0 - 0 + +
    

    输入样例:

    2 3 5
    7 8 9 10 11
    

    样例输出:

    + 0 0 0 0
    

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理

    直接模拟取球过程,首先把三个选择排个序,每次选择最大的满足条件的选择来执行,如果当前有偶数个就选择奇数的取,否则反之,如果到了最小的选择也没有满足的,就取最小的,直到剩下的球不够取了。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    typedef long long ll;
    
    int num[3],n;
    int main() {
        for(int i = 0;i < 3;i ++) {
            scanf("%d",&num[i]);
        }
        sort(num,num + 3);
        for(int i = 0;i < 5;i ++) {
            scanf("%d",&n);
            int p1 = 0,p2 = 0;
            while(n >= num[0]) {
                for(int j = 2;j >= 0;j --) {
                    if(num[j] <= n && (p1 % 2 ^ num[j] % 2 || j == 0)) {
                        p1 += num[j];
                        n -= num[j];
                        break;
                    }
                }
                for(int j = 2;j >= 0;j --) {
                    if(num[j] <= n && (p2 % 2 ^ num[j] % 2 || j == 0)) {
                        p2 += num[j];
                        n -= num[j];
                        break;
                    }
                }
            }
            if(i) putchar(' ');
            if(p1 % 2 == 1 && p2 % 2 == 0) putchar('+');
            else if(p1 % 2 == 0 && p2 % 2 == 1) putchar('-');
            else putchar('0');
        }
        return 0;
    }
  • 相关阅读:
    mysql之触发器before和after的区别
    字段与属性的区别
    功能性和非功能性需求 UP中FURPS+模型需求分类方式
    脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别
    抽象类、接口的区别 和 抽象类可以不实现接口的全部方法
    错误码:2003 不能连接到 MySQL 服务器在 (10061)
    在ubuntu下使用mysql API读取数据库的乱码问题
    vs2010下htmlcxx的编译以及环境的搭建
    effective c++ 条款15 在资源管理类中提供对原始资源的访问
    Qt 依赖包的加载
  • 原文地址:https://www.cnblogs.com/8023spz/p/8428060.html
Copyright © 2011-2022 走看看