蓝桥杯(周算法赛)~唐增玩梗

问题描述:
“收徒,收坐骑,不收十二生肖以外的动物”。当唐僧穿越到现代,竟也玩起了网络游戏中的梗。
悟空、八戒、沙僧、小白龙听闻后,误将此当作师傅新立的规矩于是纷纷开始查验自身是否属于十二生肖中的动物。若属于,则继续追随师傅;否则,便主动退出师门。
现在,请你输出一个整数,表示唐僧剩余徒弟和坐骑的总数。
输入格式:

输出格式:
输出一个整数,表示答案

思路:这个的话就定义数据结构,用一个集合(set)来存储十二生肖的动物,以方便查找。 之后判断每个伴侣,检查每个伴侣是否在十二生肖的集合中,后面再计算剩余伴侣就行。

程序如下:
#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)

//解决scanf函数在VS_2022中的返回值被忽略问题

#include <iostream>  /*预处理指令<<iostream:通用输入输出流和其他输入输出流的基类>>:
告诉编译器在编译程序时包含头文件<iostream>。<iostream>包含了输入输出流的定义,如cin(标准输入)和cout(标准输出),用于处理程序的基本输入输出操作。
通过这个指令,程序员可以使用iostream库提供的功能,比如读取用户的输入、输出数据到控制台等。*/

#include <set>  /*预处理指令||双向访问迭代器<<set:所有元素都会根据元素的键值自动被排序>>:
用于引入头文件"set"。set是C++标准库中的一个容器,它实现了无序的、不重复元素的集合,类似于数学中的集合数据结构。
当你包含这个头文件后,你可以使用std::set来创建和操作集合,比如添加、删除元素,以及查找等操作。
集合中的元素是自动排序的,并且保证不会有重复项。*/

#include <string>  /*预处理指令<<string:字符串处理>>:它告诉编译器包含头文件 “string”。
这个头文件定义了字符串 (std::string) 类型及相关函数,如字符串操作、构造和析构等。
通过包含这个文件,程序能够使用标准库提供的方便的字符串处理功能,无需自定义字符串数据结构。
在 C++ 程序中,<string>通常放在需要使用 string 对象或函数的地方上方。*/

#include <vector>/*预处理指令<<vector(随机访问迭代器):是变长数组,支持随机访问,不支持在任意位置插入>>:
它告诉编译器在程序中引入 <vector> 这个头文件。<vector> 是 C++ 标准库的一部分,它提供了一个动态数组容器,也称为向量(Vector)。
使用 vector 可以方便地存储一系列同类型的元素,并支持动态增长、随机访问以及迭代器操作。
例如,你可以创建一个 std::vector<int> 来存储整数,非常灵活且内存管理自动。
在程序中包含了这个头文件后,你就可以使用 std::vector 类型及其相关的成员函数,如 push_back() 添加元素,size() 获取大小,at() 访问特定索引的元素等。*/

/*"::" 用来明确指定变量是来自哪个 namespace 的*/
using namespace std;  //释放std命名空间中的变量名,函数名以及类型名,其中 std 是C++标准库的命名空间

int main() {
    // 十二生肖的动物
    std::set<std::string> animals = { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };
    /*这个代码是在C++中使用std::set容器来存储一组独特的字符串元素,其中每个元素都是动物名称。std::set是一个关联容器,它保证了集合中的元素是唯一的,
    并按照一定的顺序排列,通常是依据元素的自然排序(对于std::string,默认是字典序)。
    其中,std::set<std::string> 定义了一个名为animals的集合,其元素类型为std::string,即字符串。
{ "鼠", "牛", ... } 是一个初始化列表,用于创建一个包含特定元素的集合。集合会自动去除重复项。*/

    // 伴侣及其代表的动物

    std::vector<std::string> partners = { "猴", "猪", "蛇", "马" };  // 示例数据,实际数据根据需求设置
    //同上

    int count = 0;

    /*这段C++代码的功能是统计partners容器中与animals集合中存在的动物数量。变量count初始化为0,表示初始没有匹配的动物。*/
    for (const std::string& partner : partners/*表示partner是partners中的元素的常量引用,不会修改原值。*/)
         /*是一个范围基础的循环,它逐个迭代partners容器中的每个字符串引用partner。*/
    {
        //条件判断
        if (animals.find(partner) != animals.end()) 
           /*(animals.find(partner)试图在animals集合中查找指定的partner字符串。
           != animals.end() 判断是否找到了对应的元素。*/
        {
            count++;
        }
    }
    // 输出剩余徒弟和坐骑的总数
    std::cout << "唐僧剩余徒弟和坐骑的总数是: " << count << std::endl;
    /*使用std::cout输出一条信息,它是标准输入输出流库的一部分,用于显示文本到控制台或终端。
    <<操作符是“插入”运算符,连接字符串和变量,这里把字符串与count的值结合起来形成最终的输出。
    std::endl是一个换行符,意味着在打印完count的值之后,控制台会自动移至下一行。*/

    return 0;
}
运行结果:
推展:命名空间(原文如下)~转载

命名空间【C++】(超详细)_c++命名空间-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值