1018 锤子剪刀布

news2025/2/25 5:50:53

一.问题:

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

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

输入格式:

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

输出格式:

输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。

输入样例:

10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出样例:

5 3 2
2 3 5
B B

 二.思路:

        本题目难点在于输出双方各自获胜次数最多的手势。可以使用数组统计各手势获胜的次数,注意不要连平局的次数也统计进去,平局没有意义!

        然后就是注意题目要求如果解不唯一,则输出按字母序最小的解。这里要分情况讨论:

        1.三个手势赢的次数一样多,或者全输,此时输出B

        2.其中两个手势赢得次数一样多,且是赢次数最多的,此时输出按字母序最小的解

        3.只有一个手势赢次数最多,此时就输出赢次数最多的手势

三.代码实现(C语言实现):

#include <stdio.h>

// 找出获胜次数最多的手势的函数
char func(int shoushi[3])
{
    // 获胜次数最多的手势
    char result;
    // 1.三个手势赢的次数一样或者全输
    if (shoushi[0] == shoushi[1] && shoushi[0] == shoushi[2])
    {
        result = 'B';
    }
    // 2.其中两个手势赢得次数一样多,且是赢最多的
    if (shoushi[0] == shoushi[1] && shoushi[0] > shoushi[2])
    {
        result = 'C';
    }
    if (shoushi[1] == shoushi[2] && shoushi[1] > shoushi[0])
    {
        result = 'B';
    }
    if (shoushi[0] == shoushi[2] && shoushi[0] > shoushi[1])
    {
        result = 'B';
    }
    // 3.只有一个最多
    if (shoushi[0] > shoushi[1] && shoushi[0] > shoushi[2])
    {
        result = 'J';
    }
    if (shoushi[1] > shoushi[0] && shoushi[1] > shoushi[2])
    {
        result = 'C';
    }
    if (shoushi[2] > shoushi[0] && shoushi[2] > shoushi[1])
    {
        result = 'B';
    }
    return result;
}
int main()
{
    // 输入双方交锋的次数
    long long int N;
    scanf("%lld", &N);
    getchar();
    // 输入N次双方交锋的信息
    char str[100000][2];
    for (int i = 0; i < N; i++)
    {
        scanf("%c %c", &str[i][0], &str[i][1]);
        getchar();
    }

    // 分别定义记录甲乙双方的胜、平、负次数的数组
    int A_ying[3] = {0}; // 记录甲的胜、平、负次数
    int B_ying[3] = {0}; // 记录乙的胜、平、负次数

    int A_JCB[3] = {0}; // 统计甲用JCB各手势赢的次数
    int B_JCB[3] = {0}; // 统计乙用JCB各手势赢的次数

    // 计算每一轮的结果,赢1,平0,输-1
    for (int i = 0; i < N; i++)
    {
        // 甲出剪刀,乙可能出的情况
        if (str[i][0] == 'J')
        {
            if (str[i][1] == 'J') // 甲乙平局
            {
                A_ying[1]++;
                B_ying[1]++;
            }
            else if (str[i][1] == 'C') // 甲输乙赢
            {
                A_ying[2]++;
                B_ying[0]++;
                B_JCB[1]++;
            }
            else // 甲赢乙输
            {
                A_ying[0]++;
                B_ying[2]++;
                A_JCB[0]++;
            }
        }
        // 甲出锤子,乙可能出的情况
        if (str[i][0] == 'C')
        {
            if (str[i][1] == 'J') // 甲赢乙输
            {
                A_ying[0]++;
                B_ying[2]++;
                A_JCB[1]++;
            }
            else if (str[i][1] == 'C') // 甲乙平局
            {
                A_ying[1]++;
                B_ying[1]++;
            }
            else // 甲输乙赢
            {
                A_ying[2]++;
                B_ying[0]++;
                B_JCB[2]++;
            }
        }
        // 甲出布,乙可能出的情况
        if (str[i][0] == 'B')
        {
            if (str[i][1] == 'J') // 甲输乙赢
            {
                A_ying[2]++;
                B_ying[0]++;
                B_JCB[0]++;
            }
            else if (str[i][1] == 'C') // 甲赢乙输
            {
                A_ying[0]++;
                B_ying[2]++;
                A_JCB[2]++;
            }
            else // 甲乙平局
            {
                A_ying[1]++;
                B_ying[1]++;
            }
        }
    }
    // 分别找出甲乙获胜次数最多的手势
    char A_s = func(A_JCB);
    char B_s = func(B_JCB);

    // 输出
    // 甲的胜、平、负次数
    printf("%d %d %d\n", A_ying[0], A_ying[1], A_ying[2]);
    // 乙的胜、平、负次数
    printf("%d %d %d\n", B_ying[0], B_ying[1], B_ying[2]);
    // 双方获胜次数最多的手势
    printf("%c %c\n", A_s, B_s);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切&#xff08;ROI&#xff09;功能&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的图像剪切&#xff08;ROI&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff08;ROI&#xff09;功…

急救车工业路由器应用提升急救效率:车联网、数据采集与远程诊疗

急救车作为医院里医疗急救过程中的重要组成部分&#xff0c;在智慧医疗物联网领域中急救车应用4G工业路由器实现网络部署与数据采集&#xff0c;通过工业4G路由器能够实时采集到病患的生理数据、救护现场音频与视频、GPS定位以及车辆运行状态等重要信息。这些数据将被传输到医疗…

【产品资料】产品经理面试问题(一)

今天和大家免费分享产品经理常见的面试题目&#xff0c;含回答思路分析和回答事例。 更多的产品文档、原型模板、视频教程等资源&#xff0c;请关注公众号&#xff1a;Axure高保真原型

6、SpringBoot_项目的打包与运行

七、SpringBoot项目的打包与运行 1.目前项目怎么运行的 通过浏览器访问idea 将jar部署到服务器 2.maven 打包项目 命令 mvn package使用命令后会得到如下的jar 3.程序运行 命令 java -jar 项目.jar启动如下 4.springboot打包需要插件 插件 <plugin><group…

梯度下降法

梯度下降法 对于一个二元一次函数 y ax b&#xff0c;我们只需要知道两个 (x&#xff0c;y) 点即可获取到 a、b 的值&#xff0c;我们称其为精确解&#xff0c;如下图&#xff1a; 但是如果该函数中存在已知分布的噪声&#xff0c;那么又该如何求解&#xff1a; 我们可以假…

如何修复wmvcore.dll缺失问题,wmvcore.dll下载修复方法分享

近年来&#xff0c;电脑使用的普及率越来越高&#xff0c;人们在日常生活中离不开电脑。然而&#xff0c;有时候我们可能会遇到一些问题&#xff0c;其中之一就是wmvcore.dll缺失的问题。wmvcore.dll是Windows平台上用于支持Windows Media Player的动态链接库文件&#xff0c;如…

蓝桥杯每日一题2023.9.24

九进制转十进制 - 蓝桥云课 (lanqiao.cn) 题目描述 分析 #include<bits/stdc.h> using namespace std; int main() {cout << 2 * 9 * 9 * 9 0 * 9 * 9 2 * 9 2;return 0; } 顺子日期 - 蓝桥云课 (lanqiao.cn) 题目描述 分析 全部枚举 #include<bits/s…

Vector Art - 矢量艺术

什么是矢量艺术&#xff1f; 矢量图形允许创意人员构建高质量的艺术作品&#xff0c;具有干净的线条和形状&#xff0c;可以缩放到任何大小。探索这种文件格式如何为各种规模的项目提供创造性的机会。 什么是矢量艺术作品? 矢量艺术是由矢量图形组成的艺术。这些图形是基于…

LeetCode 494.目标和 (动态规划 + 性能优化)二维数组 压缩成 一维数组

494. 目标和 - 力扣&#xff08;LeetCode&#xff09; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2…

vue指令(代码部分二)

<template><view><view v-on:click"onClick">{{title}}</view><button click"clickNum">数值&#xff1a;{{num}}</button><view class"box" :style"{background:bgcolor}" click"clickB…

ROS 2官方文档(基于humble版本)学习笔记(三)

ROS 2官方文档&#xff08;基于humble版本&#xff09;学习笔记&#xff08;三&#xff09; 理解参数&#xff08;parameter&#xff09;ros2 param listros2 param getros2 param setros2 param dumpros2 param load在节点启动时加载参数文件 理解动作&#xff08;action&…

【python零基础入门学习】python进阶篇之时间表示方法和异常处理以及linux系统的os模块执行shell命令以及记账程序编写教学(一)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

第1篇 目标检测概述 —(1)目标检测基础知识

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测是计算机视觉领域中的一项任务&#xff0c;旨在自动识别和定位图像或视频中的特定目标&#xff0c;目标可以是人、车辆、动物、物体等。目标检测的目标是从输入图像中确定目标的位置&#xff0c;并使用边界框将其标…

Docker 自动化部署(保姆级教程)

Docker 自动化部署 1. jenkins 介绍1.1 参考链接&#xff1a;1.2 jenkins 概述1.3 jenkins部署项目的流程 2. jenkins 安装2.1 基于docker 镜像2.2 启动 jenkins 后端服务2.3 登录 jenkins 服务后端 3. jenkins自动化部署开始3.1 下载需要的插件3.2 创建任务3.2.1 描述3.2.2 配…

Vue3+element-plus切换标签页时数据保留问题

记录一次切换标签页缓存失效问题&#xff0c;注册路由时name不一致可能会导致缓存失效

Visio——绘制倾斜线段

一、形状 -> 图表和数学图形 -> 多行 二、放置多行线&#xff0c;可以发现存在两个折点 三、选择多行线&#xff0c;右键选择删除点&#xff0c;即可得到倾斜线段

【python爬虫】爬虫所需要的爬虫代理ip是什么?

目录 前言 一、什么是爬虫代理 IP 二、代理 IP 的分类 1.透明代理 2.匿名代理 3.高匿代理 三、如何获取代理 IP 1.免费代理网站 2.付费代理服务 四、如何使用代理 IP 1.使用 requests 库 2.使用 scrapy 库 五、代理 IP 的注意事项 1.代理 IP 可能存在不稳定性 2…

Linux指令(ls、pwd、cd、touch、mkdir、rm)

whoami who pwd ls ls -l clearls指令 ls ls -l ls -a :显示当前目录下的隐藏文件&#xff08;隐藏文件以.开头&#xff09;ls -a -l 和 ls -l -a 和 ls -la 和 ls -al &#xff08;等价于ll&#xff09; pwd命令 显示用户当前所在的目录 cd指令 mkdir code &#xff08;创建…

《Python趣味工具》——ppt的操作(1)

前面我们学习了如何利用turtle模块制作emoji&#xff0c;今天来看看PPT的相关操作&#xff1a; 文章目录 一、PPT的基础结构&#xff1a;二、PPT的相关操作&#xff1a;1. 导入pptx模块2. ppt的基本操作&#xff1a; 三、总结&#xff1a;四、 完整源码&#xff1a; 小L想要把 …