当前位置: 首页 > news >正文

20250322 c++gesp三级编程题答案

题目传送门(B4261 [GESP202503 三级] 2025)

题目传送门(B4262 [GESP202503 三级] 词频统计)

思路(B4261 [GESP202503 三级] 2025):

整体思路

本题的目标是找出满足等式 (x and y)+(x or y)=2025 的最小正整数 y。这里的 and 是二进制按位与运算(在 C++ 里用 & 表示),or 是二进制按位或运算(在 C++ 里用 | 表示)。为了求解,采用枚举法,把所有可能的正整数 y 都遍历一遍,检查是否满足给定等式。

详细步骤

  1. 输入读取

    • 借助 cin 从标准输入读取整数 x。这个 x 是题中给定的已知整数。
  2. 枚举 y 的值

    • 利用 for 循环从 1 开始逐个枚举 y 的值,上限设为 2024。之所以上限设为 2024,是因为 x 的范围是 0 ≤ x < 2025,而且 y 是正整数,所以 y 只要在 1 到 2024 这个区间内枚举就可以。
  3. 检查等式是否成立

    • 对于每一个枚举到的 y 值,计算 (x & y) + (x | y) 的结果。
    • 把计算结果和 2025 进行比较,若相等,就说明找到了满足条件的 y
  4. 输出结果

    • 一旦找到满足条件的 y,就使用 cout 把 y 输出到标准输出,然后结束程序。
    • 要是遍历完 1 到 2024 所有可能的 y 值,都没有找到满足条件的,就输出 -1,以此表明不存在符合条件的 y

代码优化思路

此代码采用的是枚举法,时间复杂度为 O(n),这里的 n 是枚举的范围(本题是 2024)。由于枚举范围比较小,所以当前代码效率还可以。要是枚举范围变大,这种方法效率就会降低。可以考虑从位运算的特性出发进行优化,不过本题数据范围较小,当前的枚举法已经足够高效。

思路(B4262 [GESP202503 三级] 词频统计):

这是一道关于统计单词出现频率并找出出现次数最多单词的题目,解题的关键在于处理单词的大小写问题以及有效地统计每个单词的出现次数。以下是详细的解题思路:

  1. 读取输入的单词数量

    • 首先从输入中读取一个整数 n,它表示接下来要输入的单词个数。可以使用 cin 来读取这个整数。
  2. 存储和统计单词出现次数

    • 为了忽略单词的大小写,我们可以将所有输入的单词都转换为小写形式。可以使用 transform 函数结合 tolower 函数来实现这一转换。
    • 采用 unordered_map 来存储每个单词及其出现的次数。unordered_map 的键是单词(小写形式),值是该单词出现的次数。
    • 循环读取 n 个单词,每次读取一个单词后,将其转换为小写形式,然后在 unordered_map 中查找该单词。如果单词已经存在于 unordered_map 中,则将其对应的值(出现次数)加 1;如果单词不存在,则在 unordered_map 中插入该单词,并将其出现次数初始化为 1。
  3. 找出出现次数最多的单词

    • 遍历 unordered_map,通过比较每个单词的出现次数,找到出现次数最多的单词。可以定义一个变量来记录当前出现次数最多的单词及其出现次数。
    • 遍历 unordered_map 时,对于每个键值对,将其值(出现次数)与当前记录的最大出现次数进行比较。如果当前单词的出现次数大于最大出现次数,则更新最大出现次数和对应的单词。
  4. 输出结果

    • 最后,输出出现次数最多的单词(以小写形式)。可以使用 cout 来输出该单词。

通过以上步骤,就可以实现对输入单词的频率统计,并找出出现次数最多的单词。

代码&解释(由于为c++考级,所以没有其他语言):

B4261 [GESP202503 三级] 2025:

#include <iostream>
using namespace std;

const int MAX_Y = 2025;

int main() {
    int x;
    cin >> x;
    int possible_y[MAX_Y];
    for (int i = 0; i < MAX_Y; i++) {
        possible_y[i] = i + 1;
    }

    for (int i = 0; i < MAX_Y; i++) {
        int y = possible_y[i];
        if ((x & y) + (x | y) == 2025) {
            cout << y << endl;
            return 0;
        }
    }

    cout << -1 << endl;
    return 0;
}    

代码思路

  1. 输入读取:使用 cin 从标准输入读取整数 x
  2. 创建数组:定义一个长度为 MAX_Y 的数组 possible_y,并将 1 到 MAX_Y 的整数依次存入数组中。这里数组的作用主要是存储所有可能的 y 值。
  3. 遍历数组:对数组进行遍历,对于每个 y 值,计算 (x & y) + (x | y) 的结果,并与 2025 进行比较。
  4. 输出结果:如果找到满足条件的 y,则输出该 y 并结束程序;若遍历完数组都未找到满足条件的 y,则输出 -1

复杂度分析

  • 时间复杂度:O(n),其中 n 为数组的长度(这里是 MAX_Y),因为需要遍历整个数组。
  • 空间复杂度:O(n),主要用于存储数组 possible_y

但是本题似乎数据简单,所以还有一种更简便的写法:

#include<iostream>
#include<string>
#include<algorithm>
#include<bitset>
#include<cmath>
#include<iomanip>
#include<cstdio>
#include<cstring>
using namespace std;

int x,y;

int main(){
	
	cin>>x;
	cout<<2025 - x;
	
	return 0;
}

B4262 [GESP202503 三级] 词频统计:

#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>

using namespace std;

// 将单词转换为小写形式
string toLowerCase(const string& word) {
    string lowerCaseWord = word;
    transform(lowerCaseWord.begin(), lowerCaseWord.end(), lowerCaseWord.begin(), ::tolower);
    return lowerCaseWord;
}

int main() {
    int n;
    cin >> n;
    cin.ignore(); 

    unordered_map<string, int> wordCount;
    string maxWord;
    int maxCount = 0;

    for (int i = 0; i < n; ++i) {
        string word;
        getline(cin, word);
        string lowerCaseWord = toLowerCase(word);

        // 统计单词出现次数
        ++wordCount[lowerCaseWord];

        // 更新出现次数最多的单词
        if (wordCount[lowerCaseWord] > maxCount) {
            maxCount = wordCount[lowerCaseWord];
            maxWord = lowerCaseWord;
        }
    }

    cout << maxWord << endl;
    return 0;
}    

代码说明

  • 命名空间简化:借助using namespace std;,代码里能够直接运用标准库中的类型(像stringunordered_map)和函数(如cincouttransform),而无需添加std::前缀。
  • 功能实现:和之前的代码逻辑一样,先是把输入的单词转换为小写形式,再用unordered_map统计每个单词的出现次数,最后找出出现次数最多的单词并输出。
希望这些代码能帮助您理解并解决这个问题,如果有问题,请随时提问。
  蒟蒻题解,神犇勿喷,点个赞再走吧!QAQ

相关文章:

  • Linux shell脚本2-test条件测试语句:文件类型、字符串是否相等、数字大小比较、多重条件判断,测试语句验证
  • Kafka消息序列化深度革命:构建高性能、高安全的自定义编码体系
  • 从扩展黎曼泽塔函数构造物质和时空的结构-7
  • 详解c语言键盘输入联系小程序
  • 解密模型上下文协议(MCP):下一代AI交互框架
  • 使用密码连接Redis服务的两种方式
  • Linux的Autojump库的安装和使用
  • pyecharts在jupyter notebook中不能够渲染图表问题。
  • el-table表格toggleRowSelection方法选中无效
  • 23种设计模式-单例(Singleton)设计模式
  • 文件的分片上传vs流失上传
  • 【2025】基于node.js的中医药科普平台的设计与实现(源码、万字文档、图文修改、调试答疑)
  • 解决Enable-WindowsOptionalFeature : 功能名称 Microsoft-Hyper-V 未知。
  • Linux驱动开发进阶(二) - sysfs文件系统
  • html5炫酷的科技感3D文字效果实现详解
  • ROS多机通信(四)——Ubuntu 网卡 Mesh 模式配置指南
  • 拥抱成长型思维:解锁持续进步的人生密码
  • 于window环境下为tyora下载安装Pandoc
  • cpp11~17 新基础类型--long long
  • go常用标准库学习笔记
  • 新型算法助力听障人士听得更清晰
  • 俄伏尔加格勒机场正式更名为斯大林格勒机场
  • 狄威已任国铁集团副总经理
  • 国际锐评:菲律宾“狐假虎威”把戏害的是谁?
  • 新开发银行如何开启第二个“金色十年”?
  • 2025上海车展 | 当智驾不再让人兴奋,汽车智能化暗战升级