• B1018. 锤子剪刀布


    题目描述

      大家都应该会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图

      现给出两人的交锋记录,请统计双方的胜、平、负次数,并给出双方分别处什么手势胜算最大

    输入格式

      第一行给出正整数N (≤ 105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的手势。C代表"锤子"、J代表"见到"、B代表"布",第一个字母代表甲方,第二个字母代表乙方,中间有一个空格

    输出格式

      第一、二行分别给出甲、乙的胜、平、负次数,数字间以一个空格分隔。第三行给出两个字母,分别表示甲、乙获胜次数最多的手势,中间有一个空格

    如果解不唯一,则输出按字典序最小的解

    输入样例

    10

    CJ

    JB

    CB

    BB

    BC

    CC

    CB

    JB

    BC

    JJ

    输出样例

    5 3 2 

    2 3 5

    B B

    #include <bits/stdc++.h>
    int change(char c){
        if(c == 'B'){
            return 0;
        }
        if(c == 'C'){
            return 1;
        }
        if(c == 'J'){
            return 2;
        }
    }
    char unchange(int n){
        if(n == 0){
            return 'B';
        }
        if(n == 1){
            return 'C';
        }
        if(n == 2){
            return 'J';
        }
    }
    int main(int argc, char *argv[]) {
        int n;     
        scanf("%d", &n);// 记录行数
        int times_A[3] = {0, 0, 0}, times_B[3] = {0, 0, 0}; // 记录甲乙胜平负次数 
        char c1, c2;
        int k1, k2;
        int count1[3] = {0, 0, 0}, count2[3] = {0, 0, 0};// 记录甲、乙获胜次数 
        int max1, max2, index1, index2;// 记录最大值和最大值对应的数组下标
        for(int i = 0; i < n; i++){
            getchar();
            scanf("%c %c", &c1, &c2);
            // 将手势转为数字 
            k1 = change(c1);
            k2 = change(c2);
            // 甲赢 
            if((k1 + 1)%3 == k2){
                times_A[0]++;
                times_B[2]++;
                count1[k1]++;
            // 平手 
            }else if(k1 == k2){
                times_A[1]++;
                times_B[1]++;
            // 乙赢 
            }else if((k2 + 1)%3 == k1){
                times_A[2]++;
                times_B[0]++;
                count2[k2]++;
            }
        }         
        printf("%d %d %d
    ", times_A[0], times_A[1], times_A[2]);    
        printf("%d %d %d
    ", times_B[0], times_B[1], times_B[2]);
        max1 = count1[0];
        max2 = count2[0];
        index1 = 0;
        index2 = 0;
        for(int i = 1;i < 3; i++){
            if(max1 < count1[i]){
                max1 = count1[i];
                index1 = i;
            }
            if(max2 < count2[i]){
                max2 = count2[i];
                index2 = i;
            }
        }
        printf("%c %c", unchange(index1), unchange(index2));
        return 0;    
    }

    题解关键

    • 计算胜平负的时候,将表示手势的字母按照字典序转化为数字的计算,B、C、J,分别转换为 0、1、2,0胜1,1胜2,2胜0,循环判断
  • 相关阅读:
    在Fedora 8 下安装Fcitx输入法
    iisweb服务器完美解决方案
    利用httpget实现计划任务访问某一指定页面
    如何升级到SQL Server 2005
    排除“计算机默认 权限设置未将 COM 服务器应用程序”的错误
    Windows 2003 服务器安全设置
    Linux Fedora8 下安装 IE6
    配置 SQL Server 以便使用 2 GB 以上的物理内存(包括SQL Server 2005)
    Entity Framework初探
    async、await在ASP.NET[ MVC]中之线程死锁的故事
  • 原文地址:https://www.cnblogs.com/YC-L/p/12128014.html
Copyright © 2020-2023  润新知