P A T 甲级:分类题型|字符串处理|1152、1150、1005、1001题解及延伸

系列目录


目录

  • 系列目录
  • 前言
  • 1152 Google Recruitment
    • 数学证明
    • substr()
    • stoi()
  • 1150 Travelling Salesman Problem
  • 1005 Spell It Right
  • 1001 A+B Format


前言


⚠️建议按照题型分类,题号从大到小的顺序刷题~
⚠️会单独写篇BLog分享具体的题型分类、合适的刷题顺序


1152 Google Recruitment

🌟字符串

原题链接


C++
若未特殊标明,以下题解均写用C++

#include <iostream>

using namespace std;

bool isPrime(int num)
{
    if (num == 1 || num == 0) return false;
    // 用 i * i <= num 优化 原因见注解
    for (int i = 2; i * i <= num; i ++)
        if (num % i == 0) 
            return false;

    return true;
}

int main()
{
    int n, k;
    string s;
    cin >> n >> k >> s;
    // i 一旦大于 n - k ,取出的string长度就不足k
    
    for (int i = 0; i <= n - k; i ++) {
        // 第一个参数 起始位置pos 
        // 第二个参数 长度len
        // 作用对象s——s.substr()
        string s1 = s.substr(i, k);
        // string to int
        int num = stoi(s1);
        if (isPrime(num)) {
            cout << s1;
            
            // return 0的作用相当于 while 里的 break
            return 0;
        }
    }

    // 循环结束也没有找到满足长度为k的 consecutive prime
    // 这里记得要加 双引号""
    cout << "404\n";

    return 0;
}   

注解:

数学证明

证明:如果 n u m 有一个大于其平方根的因子 a 那么它必然还有一个小于或等于其平方根的因子 b ,使得 a ∗ b = n u m 证明:如果 num有一个大于其平方根的因子 a \\ 那么它必然还有一个小于或等于其平方根的因子 b,使得 a * b = num 证明:如果num有一个大于其平方根的因子a那么它必然还有一个小于或等于其平方根的因子b,使得ab=num

设 a 是 n u m 的因子 且  a > n u m ⇒ 1 a < 1 n u m 由因数的定义,必然存在另一个因数 b 使得  a ∗ b = n u m b = n u m a < n u m 故得证 设a 是num的因子\ 且\ a > \sqrt{num}\\ \Rightarrow \frac{1}{a} < \frac{1}{\sqrt{num}} \\ 由因数的定义,必然存在另一个因数b \\使得\ a * b = num \\ b = \frac{num}{a} < \sqrt{num} \\ 故得证 anum的因子  a>num a1<num 1由因数的定义,必然存在另一个因数b使得 ab=numb=anum<num 故得证

因此我们可以使用 i * i <= num进行优化


substr()

substrstd::string 类的一个成员函数,用于从字符串中提取子串 这个函数接受两个参数(有时也可以接受三个参数,但在这里我们只讨论两个参数的情况):

  1. 起始位置(pos):子串开始的位置(基于0的索引)
  2. 长度(len):要提取的子串的长度

例如:

string t = s.substr(i, k);

这里 s 是一个 std::string 对象,i 是起始位置,k 是要提取的子串的长度

因此,t 将包含从 s的第 i 个字符开始,长度为 k 的子串

stoi()

stoi 是一个标准库函数,用于将字符串转换为 int 类型的整数 这个函数接受一个字符串参数,并尝试将其解析为一个整数 如果字符串包含非数字字符(除了可能的空白字符和符号字符,如 +-),则 stoi 会抛出一个 std::invalid_argument 异常 如果转换结果超出了 int 类型能够表示的范围,则会抛出一个 std::out_of_range 异常

示例:

try {  
    int num = std::stoi(t);  
    // 处理 num  
} catch (const std::invalid_argument& e) {  
    // 处理无效的输入  
} catch (const std::out_of_range& e) {  
    // 处理范围错误  
}





1150 Travelling Salesman Problem

🌟无序图+集合+二维数组

原题链接


C++
若未特殊标明,以下题解均写用C++

#include <iostream>
#include <vector>
#include <set>
#include <climits>

using namespace std;

int e[210][210], ans = INT_MAX, ansid;
// n表示顶点个数 m表示边的条数
int n, m;
vector<int> v;

void check(int index) {
    // cnt 表示 该路径的顶点数
    int sum = 0, cnt, flag = 1;
    cin >> cnt;

    // 注意 集合的定义
    set<int> s;
    vector<int> v(cnt);
    for (int i = 0; i < cnt; i ++) {
        cin >> v[i];
        // 别忘了插入集合,确保每个顶点只出现一次——便于检查比较
        s.insert(v[i]);
    }

    // 要用到 i + 1
    for (int i = 0; i < cnt - 1; i ++) {
        if(e[v[i]][v[i + 1]] == 0)
            flag = 0;
        
        // 记录权值之和
        sum += e[v[i]][v[i + 1]];
    }
    
    // 缺边
    if (flag == 0)
        printf("Path %d: NA (Not a TS cycle)\n", index);

    // 首尾顶点不是同一个顶点 或 有重复顶点
    else if (v[0] != v[cnt - 1] || s.size() != n)
        printf("Path %d: %d (Not a TS cycle)\n", index, sum);

    // 缺顶点 未被遍历
    else if (cnt != n + 1) {
        printf("Path %d: %d (TS cycle)\n", index, sum);

        if (sum < ans) {
            ans = sum;
            ansid = index;
        }
    }

    else {
        printf("Path %d: %d (TS simple cycle)\n", index, sum);

        if (sum < ans) {
            ans = sum;
            ansid = index;
        }
    }
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < m; i ++) {
        // t1-city1 t2-city2 t- destination
        int t1, t2, t;
        cin >> t1 >> t2 >> t;
        // 别忘了存储边的权值
        e[t1][t2] = e[t2][t1] = t;
    }

    // k表示要检查的路径数
    int k;
    cin >> k;
    for (int i = 1; i <= k; i ++)
        check(i);

    printf("Shortest Dist(%d) = %d\n", ansid, ans);

    return 0;
}

注解:

为什么flag == 1 只能保证所有的边存在,而不能保证所有的顶点都“存在”

  • 实际上的图,边和顶点是分不开的,一条边的存在必然确定两个顶点
  • 但图的某些部分没有被正确连接到遍历的起始点
  • 说人话就是——遍历的时候只遍历到了所有的边,但并不一定遍历了所有顶点
  • 如果为了判断某条边是否存在的同时遍历这条边的起始顶点和结束顶点,会累积大量不必要的重复





1005 Spell It Right

🌟字符串

原题链接


C++
若未特殊标明,以下题解均写用C++

// 字符串处理
#include <iostream>
#include <cstring>

using namespace std;

int main ()
{
	// 10^100 超过long long int 的范围
	// 选择使用字符串进行处理
	string a;
	cin >> a;

	int sum = 0;
	// 先求和,将 字符转换成数字
	for (int i = 0; i < a.length() - 1; i ++)
		sum += a[i] - '0';

	// 将刚才的 整数结果转化为字符串
	string s = to_string(sum);
	// 数组array 中的元素可以为任意数据类型
	// 注意 字符串是 双引号" "
	string arr[10] = {"zero", "one", "two", "three", 
	"four", "five", "six", "seven", "eight", "nine"};
	// 将所得的和转换为 consecutive words
	// 第一个字母前没有空格 我们需要单独处理
	cout << arr[s[0] - '0'];
    
	for (int i = 1; i < s.size() - 1; i ++)
		// 注意处理中间的空格;空格要用双引号括起来
		cout << " " << arr[s[i] - '0'];

	return 0;
}





1001 A+B Format

🌟字符串

原题链接


C++
若未特殊标明,以下题解均写用C++

#include <iostream>

using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;

    string sum = to_string(a + b);
    int len = sum.size();
    for (int i = 0; i < len; i ++) {
        cout << sum[i];
        if (sum[i] == '-') continue;

        if ((i + 1) % 3 == len % 3 && i != len - 1)
            cout << ',';
    }

    return 0;
}





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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何借助物联网实现农情监测与预警

如何借助物联网实现农情监测与预警&#xff1f; 物联网技术&#xff0c;作为信息技术与传统行业的深度融合产物&#xff0c;正逐步变革着农业生产的管理模式&#xff0c;特别是在农情监测与预警领域展现出巨大潜力。其核心在于通过感知层的各类传感器、通信层的数据传输技术以…

策略模式(Strategy Pattern)

策略模式 &#xff08;Strategy Pattern&#xff09; 定义 它是将定义的算法家族、分别封装起来&#xff0c;让它们之间可以相互替换&#xff0c;从而让算法的变化不会影响到使用算法的用户。 可以避免多重分支的 if-else、switch语句。 属于行为型模式。 适用场景 如果系…

Go - 7.const 使用指南

目录 一.引言 二.定义 三.实践 1. 常量的分组定义 2.枚举常量 3.常量类型 四.总结 一.引言 在编程中&#xff0c;常量&#xff08;constant&#xff09;是指在程序运行期间其值不会改变的变量。常量在代码中有助于提高可读性和维护性&#xff0c;因为它们提供了一个明确…

探索视觉世界:深入了解目标检测算法的奥秘

目标检测算法 一、介绍目标检测算法的背景和意义1.1 目标检测的定义和应用场景1.2 目标检测算法的发展历程 二、目标检测算法分类2.1 传统目标检测算法2.1.1 基于分类器的目标检测算法2.1.2 基于模板匹配的目标检测算法 2.2 深度学习目标检测算法2.2.1 两阶段目标检测算法2.2.2…

【渗透工具】远控工具Brute Ratel C4 1.4.5 --使用教程一(木马上线)

免责申明 本公众号的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息…

【Python爬虫】Python爬取喜马拉雅,爬虫教程!

一、思路设计 &#xff08;1&#xff09;分析网页 在喜马拉雅主页找到自己想要的音频&#xff0c;得到目标URL&#xff1a;https://www.ximalaya.com/qinggan/321787/ 通过分析页面的网络抓包&#xff0c;最终的到一个比较有用的json数据包 通过分析&#xff0c;得到了发送json…

Python海量数据处理脚本大集合:pyWhat

pyWhat&#xff1a;精简海联数据&#xff0c;直达数据弱点要害- 精选真开源&#xff0c;释放新价值。 概览 pyWhat是Github社区上一款比较实用的开源Python脚本工具。它能够快速提取信息中的 IP 地址、邮箱、信用卡、数字货币钱包地址、YouTube 视频等内容。当你遇到了一串莫名…

elementUI 年份范围选择器实现

elementUI 不支持年份范围的选择器&#xff0c;依照下面的文章进行修改和完善 el-year-picker&#xff1b; element日期选择范围、选择年份范围_elemet 两个日期 选择的年份范围必须在三年之内-CSDN博客 el-year-picker 组件&#xff1a; 依赖包&#xff1a;moment 属性&…

赛灵思FFT的IP核——非实时模式 Non real time

一、IP核配置 使用非实时模式配置如下 二、时序 三、资源消耗 在implement查看两者的资源消耗差不多

怎么测试远程服务器能否连通

远程服务器连接测试的方法很多&#xff0c;下面简单介绍下其中两种方法。 ping命令 按WINR快截键&#xff0c;打开“运行”对话框&#xff0c;输入cmd&#xff0c;回车&#xff0c;打开命令提示符。 输入ping IP地址或ping 域名即可&#xff0c;如ping360服务器通不通&#xf…

前端接入chatgpt,实现流式文字的显示

前端接入chatgpt,实现流式文字的显示 业务需求&#xff1a; 项目需要接入chatgpt提供的api&#xff0c;后端返回流式的字符&#xff0c;前端接收并实时显示。 相关技术原理&#xff1a; 1. JS中的Stream流: 在JavaScript中&#xff0c;使用Stream流通常指的是处理数据流的…

RK3568驱动指南|第十五篇 I2C-第172章 I2C 驱动框架编写

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

吃瓜Llama3-V之余,看多模态大模型架构演变!

今天最大的瓜莫过于&#xff1a;斯坦福 Llama3-V PK 清华 MiniCPM-Llama3-V-2.5&#xff0c;详细证据&#xff1a; https://github.com/OpenBMB/MiniCPM-V/issues/196吃瓜之余&#xff0c;来看一下多模态大模型架构演变&#xff01; 一篇优秀的论文综述了多模态AI架构——包含…

无线领夹麦克风哪个牌子好,口碑最好的麦克风品牌推荐!

自媒体的兴起极大地推动了音频设备技术的发展&#xff0c;尤其是麦克风&#xff0c;它已成为自媒体创作中不可或缺的工具。从早期的新闻采访到当下流行的网络直播和Vlog&#xff0c;麦克风的应用场景不断扩展。一个视频的音频质量直接影响观众的观看体验&#xff0c;因此&#…

使用Netty框架实现WebSocket服务端与客户端通信(附ssl)

仓库地址&#xff1a; https://gitee.com/lfw1024/netty-websocket 导入后可直接运行 预览页面 自签证书&#xff1a; #换成自己的本地ip keytool -genkey -alias server -keyalg RSA -validity 3650 -keystore D:\mystore.jks -ext sanip:192.168.3.7,ip:127.0.0.1,dns:lo…

【存储】相关内容

【存储】相关内容 1. 存储类型1. 块存储2. 文件存储3. 对象存储4. 三种存储类型对比 2. 常见的存储分类1. DAS2. SAN3. NAS4. 存储分类分析比较 3. 一些存储的概念1. LUN2. volume3. HBA4. iSCSI 1. 存储类型 块存储和文件存储是我们比较熟悉的两种主流的存储类型&#xff0c;…

《昇思25天学习打卡营第21天 | 昇思MindSporePix2Pix实现图像转换》

21天 本节学习了通过Pix2Pix实现图像转换。 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN&#xff09;实现的一种深度学习图像转换模型。可以实现语义/标签到真实图片、灰度图到彩色图、航空图到地图、白天到黑夜、线稿图到实物图的转换。Pix2Pix是将cGAN应用于有监督的图…

JavaSE--基础语法--类和对象(第二期)

&#xff08;一&#xff09;.面向对象的初步认知 1.1什么是面向对象&#xff1f; Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象…

新手使用超市收银系统应该注意哪些问题?

大部分小型超市都没怎么使用过智能收银系统&#xff0c;都是采用的传统手工收银方式&#xff0c;盘点、进货、库存也都是靠手工记录&#xff0c;完全没有接触过智能收银系统带来的优势和便利。超市收银软件特别是小区里面的超市&#xff0c;就跟传统的夫妻便利店的营销模式差不…

教育心理学期末考试重点

人本主义学习理论 人本主义主张&#xff0c;心理学应当把人作为一个整体来研究&#xff0c;而不是将人的心理肢解为不完整的几个部分&#xff0c;应该研究正常的人&#xff0c;而且更应该关注人的高级心理活动&#xff0c;如热情、信念、生命、尊严等内容。人本主义的学习理论…