94.求字符串的起始位置
题目描述
明明的问题可以归结为:输入两串字符串s和subs,求s中subs的起始位置。
代码
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
// 优化输入输出流速度
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s, subs;
while (cin >> s >> subs) {
// 使用 string 自带的 find 方法查找子串
size_t pos = s.find(subs);
if (pos != string::npos) {
// 题目要求输出从 1 开始的位置,所以需要加 1
cout << pos + 1 << "\n";
} else {
cout << 0 << "\n";
}
}
return 0;
}
总结
s.find(subs)是标准库函数可以找到s中是否有完整的subs,找到了会返回在s中的起始索引,所以要在输出时加一,没找到会返回特殊标记,即string::npos。
95.最长的单词
在一行英文单词中,找出其中最长的单词(若有多个最长,找出第一个出现的),并输出这个单词的长度。
代码
cpp
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
// 优化标准 I/O 读写速度
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string line;
while (getline(cin, line)) {
if (line.empty()) {
continue;
}
stringstream ss(line);
string word;
string longest_word = "";
int max_len = 0;
// 逐个提取单词
while (ss >> word) {
// 这样如果有长度相同的单词,它只会保留最先遇到的那一个。
if (word.length() > max_len) {
max_len = word.length();
longest_word = word;
}
}
// 按照题目要求的格式输出:长度 + 空格 + 单词
if (max_len > 0) {
cout << max_len << " " << longest_word << "\n";
}
}
return 0;
}
总结
核心思路是逐行读取输入,然后将每一行按照空格拆分成单个单词,并随时记录当前遇到的最长单词。由于题目要求如果长度相同,取最先出现 的那个,所以我们在比较长度时,只有当新单词的长度严格大于 (>)当前记录的最大长度时,才进行替换。
96.奖学金
题目描述
明明所在学校的惯例是在每学期的期末考试之后发放奖学金。
发放的奖学金共有五种,获取的条件各不相同:
- 院士奖学金:每人8000元,期末平均成绩高于80分,并且在本学期内发表1篇或1篇以上论文的学生均可获得。
- 五四奖学金:每人4000元,期末平均成绩高于85分,并且班级评议成绩高于80分的学生均可获得。
- 成绩优秀奖:每人2000元,期末平均成绩高于90分的学生均可获得。
- 西部奖学金:每人1000元,期末平均成绩高于85分的西部省份学生均可获得。
- 班级贡献奖:每人850元,班级评议成绩高于80分的学生干部均可获得。
只要符合条件就可以得奖。 每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。
例如明明的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。
由于老师在学期末的时候很忙,所以,他把奖学金统计的事情交给明明做。老师把考试的相关数据给了明明,让他统计出以下数据:
1) 哪位同学获得的奖学金最多;
2) 获得最多奖学金的同学一共获得了多少奖学金;
3) 所有获得奖学金的同学一共获得了多少奖学金;
明明虽然很愿意帮老师这个忙,但是他发现,同学的数量很多,统计起来很麻烦,经常有统计出错的情况发生。于是明明就想请你帮一个忙,帮他写一个统计程序,统计出以上三项内容。
代码
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
bool is_first = true;
while (cin >> n) {
// 控制输出格式:每组结果之间有一个空行
if (!is_first) {
cout << endl;
}
is_first = false;
string max_name = "";
int max_scholarship = -1;
long long total_scholarship = 0;
for (int i = 0; i < n; ++i) {
string name;
int avg_score, class_score, papers;
char is_leader, is_western;
cin >> name >> avg_score >> class_score >> is_leader >> is_western >> papers;
int current_scholarship = 0;
// 1. 院士奖学金:期末平均成绩高于80分,且发表论文1篇或以上
if (avg_score > 80 && papers >= 1) {
current_scholarship += 8000;
}
// 2. 五四奖学金:期末平均成绩高于85分,且班级评议成绩高于80分
if (avg_score > 85 && class_score > 80) {
current_scholarship += 4000;
}
// 3. 成绩优秀奖:期末平均成绩高于90分
if (avg_score > 90) {
current_scholarship += 2000;
}
// 4. 西部奖学金:期末平均成绩高于85分的西部省份学生
if (avg_score > 85 && is_western == 'Y') {
current_scholarship += 1000;
}
// 5. 班级贡献奖:班级评议成绩高于80分的学生干部
if (class_score > 80 && is_leader == 'Y') {
current_scholarship += 850;
}
// 累加总奖金
total_scholarship += current_scholarship;
// 更新最高奖金及获奖人姓名
if (current_scholarship > max_scholarship) {
max_scholarship = current_scholarship;
max_name = name;
}
}
// 输出当前这组测试数据的结果
cout << max_name << endl;
cout << max_scholarship << endl;
cout << total_scholarship << endl;
}
return 0;
}
总结
条件判断 :仔细对齐每一项奖学金的要求。注意边界条件,例如"高于"意味着需要使用严格大于符号 >,而不是大于等于 >=。
同分处理 :题目要求"如果不止一名学生获得的奖学金最多,输出他们之中出现最早的学生姓名"。在对比时使用 current_scholarship > max_scholarship 即可完美满足这个要求,后来者的分数即使等于最高分,也不会替换掉之前的最高分得主。
翻译
程序是一系列指令,它告诉计算机硬件对数据执行什么操作。程序可以内置在硬件本身中,或者它们可以以被称为软件的形式独立存在。在一些专门的,或"专用的"计算机中,操作指令被嵌入在它们的电路中;常见的例子是计算器、手表、汽车发动机和微波炉中的微型计算机。另一方面,一台通用计算机虽然包含一些内置程序(在ROM中)或指令(在处理器芯片中),但依赖外部程序来执行有用的任务。一旦计算机被编程,它只能做控制它的软件在任何给定时刻让它做的事情,不多也不少。广泛使用的软件包括各种各样的应用程序------即关于如何执行各种任务给计算机的指令。
目前有活跃的研究旨在利用许多有前景的新型技术制造计算机,例如光学计算机、DNA计算机、神经计算机和量子计算机。大多数计算机是通用的,能够计算任何可计算的函数,并且仅受其内存容量和运行速度的限制。然而,不同设计的计算机在解决特定问题时可以表现出截然不同的性能;例如,量子计算机有可能极其快速地破解一些现代加密算法(通过量子因式分解)。
计算机将完全按照它被编程的方式来解决问题,而不考虑效率、替代解决方案、可能的捷径或代码中可能的错误。能够学习和适应的计算机程序是人工智能和机器学习这一新兴领域的一部分。基于人工智能的产品通常分为两大类:基于规则的系统和模式识别系统。基于规则的系统试图表示人类专家使用的规则,并且开发成本往往很高。基于模式的系统使用有关问题的数据来生成结论。基于模式的系统的例子包括语音识别、字体识别、翻译以及在线营销的新兴领域。
