zoukankan      html  css  js  c++  java
  • P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布

    题目传送门

    一、以下标0开始

    #include <bits/stdc++.h>
    
    using namespace std;
    const int N = 210;
    //0 表示“剪刀”,1 表示“石头”,2 表示“布”,3 表示“蜥蜴人”,4表示“斯波克”。
    //看图打表写出对阵双方的胜负平结果二维数组
    //这个胜负平表是关键
    int g[5][5] = {
            {0, 0, 1, 1, 0},
            {1, 0, 0, 1, 0},
            {0, 1, 0, 0, 1},
            {0, 0, 1, 0, 1},
            {1, 1, 0, 0, 0}
    };
    
    int n;      //表示进行N次猜拳
    int n1;     //小A出拳的周期长度
    int n2;     //小B出拳的周期长度
    int na[N];  //表示小A出拳的规律
    int nb[N];  //表示小B出拳的规律
    int s1;     //小A赢几次
    int s2;     //小B赢几次
    
    int main() {
        //数据读入
        cin >> n >> n1 >> n2;
        for (int i = 0; i < n1; i++)cin >> na[i];
        for (int i = 0; i < n2; i++)cin >> nb[i];
    
        //开始猜拳
        for (int i = 0; i < n; i++) {
            //这一轮小A出的是啥?
            int a = na[i % n1]; //n1为循环的长度,所以每一轮后,都需要mod n1
            //这一轮小B出的是啥?
            int b = nb[i % n2]; //n2为循环的长度,所以每一轮后,都需要mod n2
    
            s1 += g[a][b];      //根据事先推出的胜负平表,找出胜负平关系,累加到小A的得分中。
            s2 += g[b][a];      //根据事先推出的胜负平表,找出胜负平关系,累加到小A的得分中。
        }
        cout << s1 << " " << s2 << endl;
        return 0;
    }
    

    二、以下标1开始

    #include <bits/stdc++.h>
    
    using namespace std;
    const int N = 210;
    
    //本文件是示例数组下标从1开始如何计算
    //数组下标从1开始时,需要注意的问题: 前n-1个用MOD没有问题,
    // 关键是n的倍数时,需要输出n,而不是0,这个与下标从0开始时有区别!
    
    //0 表示“剪刀”,1 表示“石头”,2 表示“布”,3 表示“蜥蜴人”,4表示“斯波克”。
    //看图打表写出对阵双方的胜负平结果二维数组
    //这个胜负平表是关键
    int g[5][5] = {
            {0, 0, 1, 1, 0},
            {1, 0, 0, 1, 0},
            {0, 1, 0, 0, 1},
            {0, 0, 1, 0, 1},
            {1, 1, 0, 0, 0}
    };
    
    int n;      //表示进行N次猜拳
    int n1;     //小A出拳的周期长度
    int n2;     //小B出拳的周期长度
    int na[N];  //表示小A出拳的规律
    int nb[N];  //表示小B出拳的规律
    int s1;     //小A赢几次
    int s2;     //小B赢几次
    
    int main() {
        //数据读入
        cin >> n >> n1 >> n2;
        for (int i = 1; i <= n1; i++)cin >> na[i];
        for (int i = 1; i <= n2; i++)cin >> nb[i];
    
        //开始猜拳
        for (int i = 1; i <= n; i++) {
            //这一轮小A出的是啥?
            int a = na[i % n1 == 0 ? n1 : i % n1]; 
            //n1为循环的长度,所以每一轮后,都需要mod n1
            //这一轮小B出的是啥?
            int b = nb[i % n2 == 0 ? n2 : i % n2]; 
            //n2为循环的长度,所以每一轮后,都需要mod n2
    
            s1 += g[a][b];      //根据事先推出的胜负平表,找出胜负平关系,
            // 累加到小A的得分中。
            s2 += g[b][a];      //根据事先推出的胜负平表,找出胜负平关系,
            // 累加到小A的得分中。
        }
        cout << s1 << " " << s2 << endl;
        return 0;
    }
    

    三、总结

    这种执行几次就回头再来的东东,最好是以下标0进行模拟,这样方便,以下标1进行就比较麻烦了。

  • 相关阅读:
    UML类图图示样例
    在WSSv3中通过Javascript和创建Feature扩展站点的动作菜单
    LINQ之Select各种操作
    TroubleShoot: SharePoint工作流不能自动启动
    TroubleShoot:页面上WebPart显示错误
    ECMAScript对列表项的增删改查
    隐藏SharePoint查看所有内容及回收站
    Windows2000计划任务对机器进行重新启动
    CF576E Painting Edges
    CF1491H Yuezheng Ling and Dynamic Tree
  • 原文地址:https://www.cnblogs.com/littlehb/p/15588759.html
Copyright © 2011-2022 走看看