Initial commit: C++ courseware

This commit is contained in:
xiaolinquan committed 2026-11-05 22:51:02 +08:00
commit 4a4ee7c287
1789 files changed
+373489

No files matched your search

@@ -0,0 +1,82 @@
### **青少年软件编程(C/C++)等级考试试卷(一级)- 参考答案**
**一、单项选择题 (共10题,共40分)**
1. **C** (微软Word是文字处理软件,不具备C++编译和运行环境。)
2. **B** (`.cpp` 是C++源程序的标准扩展名。)
3. **D** (A以数字开头,B包含非法字符`-`,C是关键字。D以下划线开头,合法。)
4. **A** (根据运算符优先级,先算乘法和取余,再算加法。`3 * 5` -> `15`,`15 % 2` -> `1`,`8 + 1` -> `9`。)
5. **B** (程序读取整数`15`存入变量`a`,然后输出字符串`"result="`和`a * 2`即`30`的结果。)
6. **B** (`sqrt()`函数用于计算平方根。)
7. **B** (首先`a`变为`10 + 5 = 15`。然后`b`被赋值为`15 / 3`,由于是整型除法,结果是`5`。)
8. **A** (条件`a > 3` (即`5 > 3`)为真,条件`b < 15` (即`10 < 15`)也为真。`true && true`结果为`true`,执行`if`分支。)
9. **A** (循环变量`i`的值会依次为 `0, 2, 4, 6, 8`。当`i`为`8`时,下一次`i`变为`10`,不满足`i < 10`,循环结束。共执行5次。)
10. **C** (该循环计算 `1 + 2 + 3 + 4 + 5`,结果为 `15`。)
**二、判断题 (共10题,共20分)**
11. **√**
12. **√**
13. **×** (C++要求变量必须先定义后使用。)
14. **×** (两个整数相除,结果仍为整数,小数部分被舍去,结果是 `2`。)
15. **×** (`cin`用于输入,`cout`用于输出。)
16. **√** (`pow(x, y)`计算x的y次方。)
17. **√** (`abs()`函数用于计算绝对值。)
18. **×** (`5 > 3`为`true`,`!(true)`的结果为`false`。)
19. **×** (如果`while`的条件初始就为`false`,循环体一次也不会执行。`do-while`循环至少执行一次。)
20. **√** (当`i`的值变为10时,条件`10 < 10`为`false`,循环终止,此时`i`的值是10。)
**三、编程题 (共2题,共40分)**
**21. 夹心饼干 - 参考代码**
```cpp
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
// 判断是否恰好两个相等、一个不同
// 这个逻辑可以分为三种情况:a和b相等但和c不等,或者a和c相等但和b不等,或者b和c相等但和a不等。
// 这三种情况只要满足任意一种即可,所以用 || (或者) 连接。
bool is_cookie = (a == b && a != c) ||
(a == c && a != b) ||
(b == c && b != a);
if (is_cookie) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
```
**22. 累加求和 - 参考代码**
```cpp
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int sum = 0; // 用来累加偶数和的变量,必须初始化为0
// 使用 for 循环遍历从 a 到 b 的每一个整数
for (int i = a; i <= b; ++i) {
// 使用 if 判断当前的数 i 是否为偶数
if (i % 2 == 0) {
// 如果是偶数,就将它加到 sum 中
sum += i;
}
}
// 循环结束后,输出总和
cout << sum << endl;
return 0;
}
```
@@ -0,0 +1,175 @@
### **青少年软件编程(C/C++)等级考试试卷(一级)**
**姓名:\_\_\_\_\_\_\_\_\_\_** **分数:\_\_\_\_\_\_\_\_\_\_**
**一、单项选择题 (共10题,共40分)**
( ) 1. 以下哪个软件不能用于C++程序的编写与编译运行?
A. Dev-C++ B. Visual Studio C. 微软Word D. Code::Blocks
( ) 2. 一个C++源程序文件,以下哪个后缀名是标准合法的?
A. .txt B. .cpp C. .doc D. .exe
( ) 3. 以下C++变量命名中,合法的一项是?
A. 123num B. my-age C. int D. \_score\_2026
( ) 4. C++表达式 `8 + 3 * 5 % 2` 的计算结果是?
A. 9 B. 13 C. 55 D. 0
( ) 5. 执行以下C++代码,输入`15`并回车后,输出结果是?
```cpp
#include <iostream>
int main() {
int a;
std::cin >> a;
std::cout << "result=" << a * 2;
}
```
A. result=15 B. result=30 C. 30=30 D. 编译报错
( ) 6. 以下哪个C++函数可以用于计算一个数的平方根?
A. abs() B. sqrt() C. pow() D. max()
( ) 7. 以下C++代码执行后,变量`b`的最终值是?
```cpp
#include <iostream>
int main() {
int a = 10, b;
a = a + 5;
b = a / 3;
}
```
A. 3 B. 5 C. 10 D. 15
( ) 8. 以下C++代码执行后,输出结果是?
```cpp
#include <iostream>
int main() {
int a = 5, b = 10;
if(a > 3 && b < 15)
std::cout << "YES";
else
std::cout << "NO";
}
```
A. YES B. NO C. 1 D. 0
( ) 9. 以下C++代码执行后,循环体一共会执行多少次?
```cpp
#include <iostream>
int main() {
for(int i=0;i<10;i+=2)
std::cout << i;
}
```
A. 5 B. 10 C. 4 D. 无限次
( ) 10. 以下C++代码执行后,输出的结果是?
```cpp
#include <iostream>
int main() {
int sum = 0;
for(int i=1;i<=5;i++)
sum += i;
std::cout << sum;
}
```
A. 5 B. 10 C. 15 D. 20
**二、判断题 (共10题,共20分,对的打“√”,错的打“×”)**
( ) 11. 顺序结构的程序,会按照代码书写的先后顺序依次执行。
( ) 12. C++程序必须经过编译、链接生成可执行文件后,才能在计算机上运行。
( ) 13. 在C++中,变量可以先使用,后定义。
( ) 14. C++中,`5 / 2` 的计算结果是2.5。
( ) 15. `cin` 是C++中用于输出的标准流对象。
( ) 16. `pow(2.0, 3.0)` 的计算结果是8.0。
( ) 17. `abs(-5)` 和 `abs(5)` 的返回值相同,都是5。
( ) 18. C++中,`! (5 > 3)` 的逻辑结果为 `true`。
( ) 19. `while` 循环的循环体至少会执行一次。
( ) 20. `for(int i=0;i<10;i++)` 循环结束后,`i` 的值是10。
**三、编程题 (共2题,共40分)**
**21. 夹心饼干**
**题目描述**
三个整数组成的三元组,恰好两个数相等、剩余一个数不同时,我们称其为「夹心饼干」。
给定三个整数 a, b, c,若能组成夹心饼干,输出`Yes`,否则输出`No`。
**输入格式**
输入三个整数 a, b, c。
**输出格式**
输出组成结果。
**输入样例 #1**
```
3 3 2
```
**输出样例 #1**
```
Yes
```
**输入样例 #2**
```
2 2 2
```
**输出样例 #2**
```
No
```
**说明/提示**
1 ≤ a, b, c ≤ 9
---
**22. 累加求和**
**题目描述**
给定两个整数 a, b,计算 a 到 b 之间所有偶数的和,并输出结果。
**输入格式**
输入两个整数 a, b。
**输出格式**
输出 a 到 b 之间所有偶数的和。
**输入样例 #1**
```
1 10
```
**输出样例 #1**
```
30
```
**输入样例 #2**
```
-10 10
```
**输出样例 #2**
```
0
```
**说明/提示**
−10⁴ ≤ a ≤ b ≤ 10⁴
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2020年9月.iml" filepath="$PROJECT_DIR$/.idea/C++-2020年9月.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,210 @@
//
// Created by xiaolinquan on 2024/11/5.
//
#include <bits/stdc++.h>
#include <list>
using namespace std;
// 第2题 问答题 合影效果
//int main(){
// int n;
// cin >> n;
// list<double> male;
// list<double> female;
//
// for(int i = 1; i <= n; ++i){
// string sex;
// double height;
// cin >> sex >> height;
// if(sex == "male"){
// male.push_back(height);
// }else if(sex == "female"){
// female.push_back(height);
// }
// }
// male.sort();
// female.sort(std::greater<>()); // 降序排序
//
// for(auto& i : male){
// cout << i << " ";
// }
// for(auto& i : female){
// cout << i << " ";
// }
//}
// 一个容器一次遍历的方法
//struct Person {
// string gender;
// double height;
//};
//
//bool compare(const Person& a, const Person& b) {
// // 如果性别相同,则按身高排序
// if (a.gender == b.gender) {
// if (a.gender == "male") {
// return a.height < b.height; // 男生按身高升序
// } else {
// return a.height > b.height; // 女生按身高降序
// }
// }
// // 如果性别不同,则男生在前,女生在后
// return a.gender == "male"; // 男生排在女生前面
//}
//第3题 问答题 大整数加法
//int main(){
// string num1, num2;
// cin >> num1 >> num2;
// std::reverse(num1.begin(), num1.end());
// std::reverse(num2.begin(), num2.end());
//
// string result;
// int carry = 0;
//
// for(int i = 0; i < num1.size() || i < num2.size() || carry != 0; ++i){
// int digit1 = 0, digit2 = 0;
// if(i < num1.size()){
// digit1 = num1[i] - '0';
// //digit1 = strtol(&num1[i], nullptr, 10);
// //当调用 strtol函数时,仅仅是想要转换num1[i]一个字符
// //可strtol会将它与后面的字符一起处理,直到它遇到结束符
// //strtol 的行为是将给定的字符串作为输入,并从左到右解析该字符串
// }
//
// if(i < num2.size()){
// digit2 = num2[i] - '0';
// //digit2 = strtol(&num2[i], nullptr, 10);
// }
//
// int sum = digit2 + digit1 + carry;
// carry = sum / 10;
// result.append(1, sum%10 + '0');
// }
//
// // 反转结果字符串,得到正确的顺序
// reverse(result.begin(), result.end());
//
//// int i = 0;
//// while(i < result.size()){
//// if(result[i] == '0'){
//// i++;
//// }else{
//// break;
//// }
//// }
// bool flag = false; // 标志位,指示着字符串里面的0是否应该输出
// for(int i = 0; i < result.size(); ++i){
// if(result[i] != '0'){ flag = true; }
// if(result[i] == '0' && !flag){ continue;} // !flag表示这个0不应该输出,那么就直接跳过
// cout << result[i];
// }
//
//}
//第4题 问答题 细菌的繁殖与扩散
//int main(){
// int arr[9][9];
// int result[9][9];
// for(int j = 0; j < 9; ++j) {
// for (int k = 0; k < 9; ++k) {
// arr[j][k] = 0;
// result[j][k] = 0;
// }
// }
// cin >> arr[4][4];
// int n;
// cin >> n;
// for(int day = 1; day <= n; ++day){
// // 每天之前清空result数组
// for (int i = 0; i < 9; ++i) {
// for (int j = 0; j < 9; ++j) {
// result[i][j] = 0;
// }
// }
//
// for(int j = 0; j < 9; ++j){
// for(int k = 0; k < 9; ++k){
// int num = arr[j][k];
// if(arr[j][k] > 0){
// result[j][k] = result[j][k] + 2*num;// 本单元格留下的细菌数目 = 在本单元格上新繁殖的+原有从其他单元格繁殖过来的
//
// if(j > 0){
// result[j - 1][k] += num; // 上
// if(k > 0) result[j - 1][k - 1] += num;// 左上
// if(k < 8) result[j - 1][k + 1] += num;// 右上
// }
//
// if(j < 8){
// result[j + 1][k] += num; // 下
// if(k > 0) result[j + 1][k - 1] += num;// 左下
// if(k < 8) result[j + 1][k + 1] += num;// 右下
// }
//
// if(k > 0) result[j][k - 1] += num; //左
//
// if(k < 8) result[j][k + 1] += num; //右
//
// }
// }
// }
// // 更新arr数组为新的细菌分布
// for(int j = 0; j < 9; ++j) {
// for (int k = 0; k < 9; ++k) {
// arr[j][k] = result[j][k];
// }
// }
// }
//
// for(int j = 0; j < 9; ++j) {
// for (int k = 0; k < 9; ++k) {
// cout << result[j][k] << " ";
// }
// cout << endl;
// }
//}
// 第5题
//int main(){
// char str[101];
// gets(str);
// int end = strlen(str) - 1;
// for(int i = strlen(str) - 1; i >= 0; --i){
// if(str[i] == ' '){
// for(int j = i + 1; j <= end; ++j){
// cout << str[j];
// }
// cout << " ";
// end = i - 1;
// }
// if(i == 0){
// for(int j = i; j <= end; ++j){
// cout << str[j];
// }
// }
// }
//}
int main()
{
string input;
getline(cin, input); // 读取整行输入
stringstream ss(input); // 使用 stringstream 来按空格分割字符串
vector<string> words; // 用一个 vector 来存储分割后的单词
string word;
while (ss >> word) { // 按空格读取每个单词
words.push_back(word);
}
// 输出倒排后的单词
for (int i = words.size() - 1; i >= 0; --i) {
cout << words[i]; // 输出单词
if (i != 0) {
cout << " "; // 在单词之间添加空格,最后一个单词后不加空格
}
}
return 0;
}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2020年12月.iml" filepath="$PROJECT_DIR$/.idea/C++-2020年12月.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,222 @@
//
// Created by xiaolinquan on 2024/11/6.
//
#include <bits/stdc++.h>
using namespace std;
// 数组指定部分逆序重放
//int main(){
// int n, k;
// cin >> n >> k;
// int arr[n];
// for(int i = 0; i < n; ++i){
// cin >> arr[i];
// }
//
// for(int i = k - 1; i >= 0; --i){
// cout << arr[i] << " ";
// }
//
// for(int i = k; i < n; ++i){
// cout << arr[i] << " ";
// }
//}
// 简单密码
//int main(){
// char ch[201];
// gets(ch);
// for(int i = 0; i < strlen(ch); ++i){
// if('A' <= ch[i] && ch[i] <= 'Z'){
// int target = ch[i] - 31;
// if(target < 'A'){ // 如果目标字符小于 'A',则需要循环回到 'Z' 后
// target += 26;// 使字符回绕
// }
// cout << char(target);
// }else{
// cout << ch[i];
// }
// }
//}
//错误探测
//int n;
//bool check(vector<vector<int> >arr){
// for(int i = 0; i < n; ++i){
// int sum1 = 0, sum2 = 0;
// for(int j = 0; j < n; ++j){
// sum1 += arr[i][j];
// sum2 += arr[j][i];
// }
// if(sum1 % 2 != 0 || sum2 % 2 != 0){
// return false;
// }
// }
// return true;
//}
//int main(){
// cin >> n;
// vector<vector<int> > arr(n, vector<int>(n));
//
// for(int i = 0; i < n; ++i){
// for(int j = 0; j < n; ++j){
// cin >> arr[i][j];
// }
// }
//
// if(check(arr)){
// cout << "OK";
// return 0;
// }else{
// for(int i = 0; i < n; ++i){
// for(int j = 0; j < n; ++j){
// arr[i][j] = 1 - arr[i][j];
// if(check(arr)){
// cout << i + 1 << " " << j + 1;
// return 0;
// }
// arr[i][j] = 1 - arr[i][j];
// }
// }
// }
// cout << "Corrupt";
//}
// 效率更好的办法
//int main() {
// cin >> n;
// vector<vector<int>> arr(n, vector<int>(n));
//
// // 读取矩阵
// for (int i = 0; i < n; ++i) {
// for (int j = 0; j < n; ++j) {
// cin >> arr[i][j];
// }
// }
//
// // 先检查是否符合条件
// if (check(arr)) {
// cout << "OK";
// return 0;
// }
//
// // 找到需要修改的行和列,即合为奇数的行和列
// vector<int> rowOdd(n, 0), colOdd(n, 0);
//
// // 统计每行和每列中1的个数是否为奇数
// for (int i = 0; i < n; ++i) {
// int rowCount = 0, colCount = 0;
// for (int j = 0; j < n; ++j) {
// rowCount += arr[i][j];
// colCount += arr[j][i];
// }
// // 将为奇数的行列对应的下标标记为1
// if (rowCount % 2 != 0) rowOdd[i] = 1;
// if (colCount % 2 != 0) colOdd[i] = 1;
// }
//
// // 统计检查奇数行列的个数
// int rowError = 0, colError = 0;
// for (int i = 0; i < n; ++i) {
// rowError += rowOdd[i];
// colError += colOdd[i];
// }
//
// // 如果没有行和列的错误,则已经符合条件,直接输出
// if (rowError == 0 && colError == 0) {
// cout << "OK";
// return 0;
// }
//
// // 如果恰好有一个错误的行和一个错误的列,则反转他们之间的交点即可符合条件
// if (rowError == 1 && colError == 1) {
// for (int i = 0; i < n; ++i) {
// if (rowOdd[i]) {
// for (int j = 0; j < n; ++j) {
// if (colOdd[j]) {
// // 反转这个元素
// cout << i + 1 << " " << j + 1;
// return 0;
// }
// }
// }
// }
// }
//
// // 如果没有解决方案,输出 Corrupt
// cout << "Corrupt";
// return 0;
//}
// 奇数单增序列
//void insert_sort(vector<int>& arr, int num){
// arr.push_back(num);
// int size = arr.size();
// for(int i = size - 1; i > 0; --i){
// if(arr[i] < arr[i - 1]){
// swap(arr[i], arr[i - 1]);
// }else{
// break;
// }
// }
//}
//
//int main(){
// int N;
// cin >> N;
// vector<int> arr;
// for(int i = 0; i < N; i++){
// int a;
// cin >> a;
// if(a % 2 != 0){
// insert_sort(arr, a);
// }
// }
//
// for(int i : arr){
// cout << i << " ";
// }
//}
// 话题焦点人物
//int main(){
// int N;
// cin >> N;
//
// // 用于存储每个被提及者的提及者列表
// unordered_map<int, vector<int>> mentioners;
//
// vector<int> mention_count(100, 0);
// for(int i = 0; i < N; ++i){
// int a, k; // 发送者序号a,提及人数k
// cin >> a >> k;
//
// // 输入所有发送者提及的人
// for(int j = 0; j < k; ++j){
// int mentioned_user_id;
// cin >> mentioned_user_id;
//
// mention_count[mentioned_user_id] += 1; // 增加被提及人的提及次数
// mentioners[mentioned_user_id].push_back(a);// 记录提及者
// // Tips:如果键不存在,就会自动创建它并分配一个空的 vector<int>
//
// }
// }
//
// // 找到被提及最多的用户
// int max = INT_MIN;
// for(auto i : mention_count){
// if(i > max){
// max = i;
// }
// }
// cout << max << endl;
// std::sort(mentioners[max].begin(), mentioners[max].end());
// for(int i : mentioners[max]){
// cout << i << " ";
// }
//}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2021年3月.iml" filepath="$PROJECT_DIR$/.idea/C++-2021年3月.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,86 @@
//
// Created by xiaolinquan on 2024/11/7.
//
#include <bits/stdc++.h>
using namespace std;
//// -1为输,0为平局,1为赢
//int check(int a, int b){
// if(a == 0){
// switch (b) {
// case 0: return 0;
// case 2: return 1;
// case 5: return -1;
// default: return -2;
// }
// }
// if(a == 2){
// switch (b) {
// case 0: return -1;
// case 2: return 0;
// case 5: return 1;
// default: return -2;
// }
// }
// if(a == 5){
// switch (b) {
// case 0: return 1;
// case 2: return -1;
// case 5: return 0;
// default: return -2;
// }
// }
//}
//
//int main(){
// int N, NA, NB;
// cin >> N >> NA >> NB;
// int a[NA], b[NB];
//
// for(int i = 1; i <= NA; ++i){
// cin >> a[i];
// }
// for(int i = 1; i <= NB; ++i){
// cin >> b[i];
// }
//
// int win_a = 0, win_b = 0;
// int pa = 0, pb = 0;
// for(int i = 0; i < N; ++i){
// int result = check(a[pa], b[pb]);
// if(result == -1){
// win_b++;
// }else if(result == 1){
// win_a++;
// }
//
// pa = ++pa % (NA + 1);
// pb = ++pb % (NB + 1);
// }
//
// if(win_a > win_b){
// cout << "A";
// }else if(win_b > win_a){
// cout << "B";
// }else{
// cout << "draw";
// }
//}
int main(){
int n, k;
cin >> n >> k;
map<double, int> score_id_map;
vector<double> scores;
for(int i = 0; i < n; i++){
int id;
double score;
cin >> id >> score;
score_id_map.insert({score, id});
scores.push_back(score);
}
std::sort(scores.begin(), scores.end());
cout << score_id_map[scores[k - 1]] << " " << scores[k - 1];
}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2021年6月.iml" filepath="$PROJECT_DIR$/.idea/C++-2021年6月.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,149 @@
//
// Created by xiaolinquan on 2024/11/11.
//
#include <bits/stdc++.h>
using namespace std;
// 数字放大
//int main(){
// int N;
// cin >> N;
// int arr[N];
// for(int i = 0; i < N; i++){
// cin >> arr[i];
// }
// int x;
// cin >> x;
//
// for(int i = 0; i < N; i++){
// cout << arr[i] * x << " ";
// }
//}
//统一文件名,传统方法
//int main(){
// int n;
// cin >> n;
// // 读取文件名
// vector<string> arr(n);
// for(int i = 0; i < n; ++i){
// cin >> arr[i];
// }
//
// for(int i = 0; i < arr.size(); ++i){
// //判断当前循环到的arr[i]的首字符是否是小写字母
// if('a' <= arr[i][0] && arr[i][0] <= 'z'){
// cout << char(arr[i][0] - 'a' + 'A');
// // a = 10 b = 11 c = 12
// // 比方说y-a计算的是y与a的差值,y与a的差值与Y和A的差值是一样的
// // 所以这个差值加上A就等于对应的大写字母了
// }else{
// cout << arr[i][0];
// }
//
// for(int j = 1; j < arr[i].size(); j++){
// cout << arr[i][j];
// }
// cout << endl;
// }
//}
// 简便方法
//int main() {
// int n;
// cin >> n;
// vector<string> arr(n);
// // 读取文件名
// for (int i = 0; i < n; ++i) {
// cin >> arr[i];
// }
// // 转换首字母为大写并输出文件名
// for (int i = 0; i < arr.size(); ++i) {
// string word = arr[i];
// cout << char(toupper(word[0]));// 使用 toupper 转换首字母为大写 #include <cctype>
// cout << word.substr(1) << endl;// 输出剩余字符
// }
//}
// 内部元素之和
//int main(){
// int m, n, sum = 0;
// cin >> m >> n;
// vector<vector<int> > arr(n, vector<int>(m));
// for(int i = 0; i < m; ++i){
// // 遍历第i行
// for(int j = 0; j < n; ++j){
// // 遍历第i行中的第j列元素
// cin >> arr[i][j]; // 输入元素
// if(i != 0 && i != n - 1 && j != 0 && j != m - 1){
// sum += arr[i][j];
// }
// }
// }
// cout << sum;
//}
//ostream& operator<<(ostream& os, const vector<int>& arr){
// for(auto& i : arr){
// cout << i;
// if(i != arr.back()){
// cout << " ";
// }
// }
// return os;
//}
// 整数排序
//int main(){
// vector<int> jishu;
// vector<int> oushu;
// for(int i = 0; i < 10; ++i){
// int num;
// cin >> num;
// if(num % 2 == 0){
// oushu.push_back(num);
// }else{
// jishu.push_back(num);
// }
// }
//
// std::sort(jishu.begin(), jishu.end(), std::greater()); // 降序排序
// //std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; }); // 还可以使用lamba表达式
// cout << jishu << " ";
// for(int i = oushu.size() - 1; i >= 0; i--){
// cout << oushu[i];
// if(i != 0){
// cout << " ";
// }
// }
//}
// 计算好数
//int main(){
// int N, sum = 0; // 读取用户输入的整数 N,并初始化计数器 sum,用于记录“好数”的个数
// cin >> N;
//
// // 遍历从 1 到 N 的每一个整数
// for(int i = 1; i <= N; i++){
// int num = i; // 将当前数字 i 赋值给 num,以便在不修改 i 本身的情况下进行二进制处理
// int count_0 = 0, count_1 = 0; // 初始化二进制中 0 和 1 的计数器
//
// // 将 num 转换为二进制并统计 1 和 0 的数量
// while(num != 0){
// char ch = char(num % 2 + '0'); // 将 num 的最低位(0 或 1)转换为字符 ch
// if(ch == '1'){
// count_1++; // 如果是 '1',计数器 count_1 加 1
// } else {
// count_0++; // 如果是 '0',计数器 count_0 加 1
// }
// num /= 2; // 去掉二进制中 num 的最低位(右移一位),继续处理下一个二进制位
// }
//
// // 如果 1 的数量大于 0 的数量,则当前数字是“好数”
// if(count_1 > count_0){
// sum++; // 增加“好数”计数器
// }
// }
// // 输出总的“好数”数量
// cout << sum;
//}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2021年9月.iml" filepath="$PROJECT_DIR$/.idea/C++-2021年9月.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,161 @@
//
// Created by xiaolinquan on 2024/11/13.
//
#include <bits/stdc++.h>
using namespace std;
////字符统计
//int main(){
// string str;
// cin >> str;
//
// int arr[26] = {0}; // 下标0-25对应着a-z,其中数组对应下标的值代表着对应下标的字符出现的个数
//
// char max_char = 'a'; // 初始假定出现最多的字符为'a'
// int max_count = 0; // 最大出现次数初始化为0
//
// for(auto& ch : str){
// int id = ch - 'a'; // 计算这个字符所对应的数组下标
// arr[id]++;
// // 更新最大字符及出现次数,并且还需要确保相同次数时优先选择ASCII码最小的字符
// if(arr[id] > max_count || (arr[id] == max_count && ch < max_char) ){
// max_char = ch; // 替换新的出现最多的字符
// max_count = arr[id];
// }
// }
// cout << max_char << " " << max_count;
//}
//
//// 图像处理
//int main(){
// int n, m;
// cin >> n >> m;
// int matrix[n][m];
// int new_matrix[n][m];
//
// // 输入图像数据
// for(int i = 0; i < n; ++i){
// for(int j = 0; j < m; ++j){
// cin >> matrix[i][j];
// }
// }
//
// // 模糊处理
// for(int i = 0; i < n; ++i){
// for(int j = 0; j < m; ++j){
// if(i == 0 || i == n - 1 || j == 0 || j == m - 1){
// //如果再边界上的话则不需要进行处理,直接将值拷贝
// new_matrix[i][j] = matrix[i][j];
// }else{
// // 计算上下左右及自身的平均值
// new_matrix[i][j] = (int)round( (matrix[i+1][j] + matrix[i-1][j] + matrix[i][j-1] + matrix[i][j+1])/4);
// }
// }
// }
//
// // 输出模糊处理后的图像
// for(int i = 0; i < n; ++i){
// for(int j = 0; j < m; ++j){
// cout << new_matrix[i][j] << " ";
// }
// cout << endl;
// }
//}
//
//// 替换单词
//int main(){
// string str;
// getline(cin,str, '\n'); // gets(str.data());
// //需要分割为一个一个的单词
// int start = 0;
// vector<string> words;
// for(int i = 0; i <= str.size(); ++i){ // 将i故意取到最后的字符的后一个位置,这样在后面进行拼接字符串的时候不需要考虑这个特殊情况了
// if(str[i] == ' ' || i == str.size()){
// string word;
// for(int j = start; j < i; ++j){ // 无论是取到空格还是取到最后的字符的后一个位置,j都是取不到i的
// word += str[j];
// }
// start = i + 1;
// words.push_back(word);
// }
// }
//
// string src, target;
// cin >> src >> target;
// for(auto& word : words){
// if(word == src){
// word = target;
// break;
// }
// }
//
// for(auto& word : words){
// cout << word << " ";
// }
//}
//
// 替换单词的另一种简洁方法
//int main() {
// string str, src, target;
// getline(cin, str);
// cin >> src >> target;
//
// stringstream ss(str);
// string word;
//
// // 用于判断是否应该输出空格
// bool first = true;
//
// // 遍历并替换单词
// //ss >> word 会返回一个布尔值。如果提取单词成功,它返回 true;如果流中没有更多单词或者遇到其他错误将返回 false。
// while (ss >> word) {
// if (word == src) word = target;
// if (!first) cout << " "; // 不是输出第一个单词的情况下抖应该在单词前面输出空格来分隔单词
// cout << word;
// first = false;
// }
//}
//// 偶数降序输出
//int main(){
// int N;
// cin >> N;
// vector<int> arr;
// for(int i = 0; i < N; ++i){
// int num;
// cin >> num;
// if(num % 2 == 0){
// arr.push_back(num);
// }
// }
// std::sort(arr.begin(), arr.end(), std::greater());
// // 或使用反向迭代器std::sort(arr.rbegin(), arr.rend());
// // 反向迭代器的工作原理是指向容器中的元素,并且其“++”操作符会使它向前移动一个位置(从右向左)。
// // 反向迭代器 rbegin 指向容器的最后一个元素,rend 则指向容器第一个元素的“前一个位置”
// // 这种设计使 rend 本身不指向任何有效元素,因此遍历的停止条件是 it != rend
// // std::sort 对 [arr.rbegin(), arr.rend()) 这个反向区间按照升序排序
// // 但由于反向迭代器在实际访问容器时方向相反,这就使得原本应升序排列的元素在容器内呈现降序排列效果
// for(auto& num : arr){
// cout << num << " ";
// }
//}
//
//// 满足条件的数的累加2
//int main(){
// int N, k, sum = 0;
// cin >> N;
// vector<int> arr(N);
// // 循环输入N个目标数字
// for(int i = 0; i < N; ++i){
// cin >> arr[i];
// }
// cin >> k;
// // 累加个位数为 k 的数
// for(auto& num : arr){
// if(num % 10 == k){
// sum += num;
// }
// }
// cout << sum;
//}
//
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2021.12.iml" filepath="$PROJECT_DIR$/.idea/C++-2021.12.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,180 @@
//
// Created by xiaolinquan on 2024/11/20.
//
#include <bits/stdc++.h>
using namespace std;
//// 统计指定范围里的数
//int main(){
// int n;
// cin >> n;
// int arr[n];
// for (int i = 0; i < n; ++i) {
// cin >> arr[i];
// }
// int L, R, count = 0;
// cin >> L >> R;
// for (int i = 0; i < n; ++i) {
// if(L <= arr[i] && arr[i] <= R){
// count++;
// }
// }
// cout << count;
//}
//// 按照个位数排序
// 比较函数返回true代表着:第一个参数小于第二个参数
//bool compare(int num1, int num2){
// int digit_num1 = num1 % 10;
// int digit_num2 = num2 % 10;
// if(digit_num1 == digit_num2){
// return num1 < num2; // 判断第一个参数是否小于第二个参数
// }else{
// return digit_num1 < digit_num2;
// }
//}
//
//int main(){
// int n;
// cin >> n;
// int arr[n];
// for (int i = 0; i < n; ++i) {
// cin >> arr[i];
// }
// std::sort(arr, arr + n, compare);
//
// for (int i = 0; i < n; ++i) {
// cout << arr[i] << " ";
// }
//}
//// 过滤多余的空格传统办法
//int main() {
// string input;
// // getline函数的第一个参数是输入流(通常是cin),它指的是你希望从哪个流中读取一行数据
// getline(std::cin, input); // 读取整行输入;或者也可使用 gets(input.data())
//
// string str;
// bool lastWasSpace = false;// 标志量,判断上一个字符是不是空格
//
// for (char c : input) {
// if (c == ' ') {
// if (!lastWasSpace) {
// str += c; // 如果上一个字符不是空格,则添加一个空格
// lastWasSpace = true;
// }
// } else {
// str += c; // 添加非空格字符
// lastWasSpace = false;
// }
// }
//
// cout << str << endl; // 输出处理后的字符串
// return 0;
//}
//// 过滤多余的空格简便办法
//int main() {
// string input;
// getline(cin, input); // 读取整行输入
//
// // 它是一个基于字符串的流类,允许你将字符串视为输入或输出流,类似于cin和cout对标准输入输出流的操作
// // 它支持所有的流操作符(如<<和>>),使得处理字符串变得像处理文件或控制台输入输出一样简单
// stringstream ss(input);
// string word;
//
// bool first = true;
// while (ss >> word) {
// if (!first){
// cout << " "; // 输出第一个单词之前,不输出空格
// }
// cout << word;
// first = false;
// }
// cout << endl;
// return 0;
//}
//// 图像叠加
//int main(){
// int m, n;
// cin >> m >> n;
//
// int arr1[m][n];
// int arr2[m][n];
// int res[m][n];
// for (int i = 0; i < m; ++i) {
// for (int j = 0; j < n; ++j) {
// cin >> arr1[i][j];
// }
// }
// for (int i = 0; i < m; ++i) {
// for (int j = 0; j < n; ++j) {
// cin >> arr2[i][j];
// res[i][j] = arr1[i][j] + arr2[i][j]; // 或使用res[i][j] = arr1[i][j] | arr2[i][j];
// }
// }
//
// for (int i = 0; i < m; ++i) {
// for (int j = 0; j < n; ++j) {
// cout << (bool)res[i][j] << " ";
// }
// cout << endl;
// }
//}
//// 出书最多
//// 定义一个比较函数,用于std::max_element
//// 比较函数返回true代表着:第一个参数小于第二个参数
//// 这里我们比较的是每个作者的图书数量
//bool compare(const pair<char, vector<int> >& a, const pair<char, vector<int> >& b){
// return a.second.size() < b.second.size(); // 如果a的图书数量小于b的图书数量,返回true
//}
//
//int main(){
// // 创建一个无序映射,键为作者(用字符表示),值为该作者的图书编号列表
// unordered_map<char, vector<int> > authorBooks; // 作者 -> 图书编号列表
//
// int m;
// // 输入图书的总数量
// cin >> m;
//
// // 循环读取m本图书的信息
// for(int i = 0; i < m; ++i){
// int bookID; // 图书编号
// string authors; // 作者列表,用字符串表示
//
// // 读取图书编号和作者列表
// cin >> bookID >> authors;
//
// // 遍历作者列表中的每个作者
// for(auto author : authors){
// // 将图书编号加入到该作者的图书列表中
// // 如果该作者之前没有书,authorBooks[author]操作会创建一个新的vector
// authorBooks[author].push_back(bookID);
// }
// }
//
// // 使用std::max_element找出出书最多的作者
// // 返回的迭代器指向出书最多的作者对应的键值对
// // 类型实际为 unordered_map<char, vector<int>>::iterator
// auto maxAuthor = std::max_element(authorBooks.begin(), authorBooks.end(), compare);
//
// // 输出出书最多的作者
// cout << maxAuthor->first << endl; // 作者的字母表示
//
// // 输出该作者的书籍数量
// cout << maxAuthor->second.size() << endl;
//
// // 输出该作者的书籍编号列表
// for(auto book : maxAuthor->second){
// cout << book << endl; // 每个图书编号
// }
//
// return 0;
//}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2022.03.iml" filepath="$PROJECT_DIR$/.idea/C++-2022.03.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,155 @@
//
// Created by xiaolinquan on 2024/11/20.
//
#include <bits/stdc++.h>
using namespace std;
//// 温度统计
//int main(){
// int n;
// cin >> n; // 读取温度数据的个数
// vector<int> temperature(n); // 创建一个vector来存储温度数据
// for (int i = 0; i < n; ++i) {
// cin >> temperature[i]; // 读取每个温度值
// }
// int t, count = 0;
// cin >> t; // 读取需要查询的温度
// for (int i = 0; i < n; ++i) {
// if(temperature[i] == t){ // 如果温度等于查询温度,计数加1
// count++;
// }
// }
// cout << count << endl; // 输出查询温度出现的次数
//}
//// 序列排序
//int sumOfDigits(int num) { // 计算数字各位数和的辅助函数
// int sum = 0;
// while (num) {
// sum += num % 10;
// num /= 10;
// }
// return sum;
//}
//// 自定义比较函数,用于比较数字的各位数和和数字本身
// 比较函数返回true代表着:第一个参数小于第二个参数,但是因为需要实现从大到小的排序,大的要放在前面,小的放在后面,所以越大的反而应该越小,越小的的反而应该越大
//bool compare(int a, int b) {
// int sumA = sumOfDigits(a), sumB = sumOfDigits(b);
// if (sumA == sumB) return a > b; // 如果各位数和相等,比较数字本身
// return sumA > sumB; // 否则比较各位数和
//}
//
//int main(){
// int n;
// cin >> n; // 读取序列的大小
// vector<int> arr(n); // 创建一个vector来存储序列
//
// for (int i = 0; i < n; ++i) {
// cin >> arr[i]; // 读取每个数字
// }
// // 使用自定义的比较函数排序
// sort(arr.begin(), arr.end(), compare);
//
// // 输出排序后的序列
// bool first = true;
// for (int i = 0; i < n; ++i) {
// if(!first) cout << " "; // 除了第一个数字外,其余数字前都加一个空格
// first = false;
// cout << arr[i];
// }
// cout << endl;
//}
////单词的长度
//int main(){
// string inputs;
// getline(cin, inputs); // 读取整行输入
// stringstream ss(inputs); // 创建stringstream来处理输入的字符串
// string word;
// bool first = true;
//
// while(ss >> word){ // 遍历每个单词
// if(!first) cout << ","; // 如果不是第一个单词,输出逗号
// cout << word.size(); // 输出单词长度
// first = false;
// }
// cout << endl;
//}
//// 扫雷游戏地雷数计算
// 定义8个方向的偏移量
//const int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
//const int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
//
//// 检查坐标是否在雷区内
//bool isValid(int x, int y, int n, int m) {
// return x >= 0 && x < n && y >= 0 && y < m;
//}
//
//int main() {
// int n, m;
// cin >> n >> m;
//
// // 读取雷区布局
// vector<string> mineField(n);
// for (int i = 0; i < n; ++i) {
// cin >> mineField[i];
// }
//
// // 创建一个新的二维数组来存储每个格子的地雷数
// vector<vector<char>> result(n, vector<char>(m));
//
// for (int i = 0; i < n; ++i) {
// for (int j = 0; j < m; ++j) {
// if (mineField[i][j] == '*') {
// result[i][j] = '*'; // 如果是地雷,直接输出'*'
// } else {
// int count = 0;
// // 检查周围8个方向的格子
// for (int k = 0; k < 8; ++k) {
// int newX = i + dx[k];
// int newY = j + dy[k];
// if (isValid(newX, newY, n, m) && mineField[newX][newY] == '*') {
// count++;
// }
// }
//
// result[i][j] = (char)count + '0'; // 将数字转换为字符
// }
// }
// }
//
// // 输出结果
// for (int i = 0; i < n; ++i) {
// for (int j = 0; j < m; ++j) {
// cout << result[i][j];
// }
// cout << endl;
// }
// return 0;
//}
//// 古代密码
//int main(){
// const int order[10] = {2,1,5,4,3,7,6,10,9,8}; // 排列顺序
// string password, source;
// cin >> password >> source;
//
// // 遍历每个字符进行检查
// for(int i = 0; i < password.size(); i++){
// char expected = ((source[i] - 'A' + 1) % 26) + 'A'; // 替换逻辑,将原文替换为密文
//
// // 也可使用这两行代码来完成:if(expected != 'Z'){ expected = expected + 1; }// 替换成它的下一个字符
// // else{ expected = 'A'; } // 'Z'替换成'A'
//
// // 检查替换后的字符是否匹配
// if(expected != password[order[i] - 1]){ // 注意这里是-1,因为order数组中的指示排列顺序元素是从1开始索引的,比方说order[0] = 2,可2在数组眼里是第三个值了,所以需要-1
// cout << "NO" << endl; // 输出"NO"并结束程序
// return 0;
// }
// }
// cout << "YES" << endl; // 如果所有字符都匹配,输出"YES"
// return 0;
//}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2022.09.iml" filepath="$PROJECT_DIR$/.idea/C++-2022.09.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,291 @@
//
// Created by xiaolinquan on 2024/11/22.
//
#include <bits/stdc++.h>
using namespace std;
////第 1 题 问答题
////统计误差范围内的数
////统计一个整数序列中与指定数字m误差范围小于等于X的数的个数。
////时间限制:5000
////内存限制:65536
////输入
////输入包含三行:
////第一行为N,表示整数序列的长度(N <= 100);
////第二行为N个整数,整数之间以一个空格分开;
////第三行包含2个整数,为指定的整数m,误差范围X。
////输出
////输出为N个数中与指定数字m误差范围小于等于X的数的个数。
////样例输入
////5
////1 2 3 4 5
////3 1
////样例输出
////3
////提示
////样例中2,3,4都满足条件,故答案为3
////解题思路:
////读取序列长度N。
////读取N个整数。
////读取目标值m和误差范围X。
////遍历数组,统计每个数与m的差值绝对值小于等于X的个数。
////输出结果。
//int main() {
// int N, count = 0; // N: 数组长度, count: 符合条件的数的个数
// cin >> N; // 读取数组长度
//
// int arr[N]; // 声明长度为 N 的变长数组
// for (int i = 0; i < N; ++i) {
// cin >> arr[i]; // 依次读取 N 个整数,存入数组
// }
//
// int m, X; // 目标值 m 和误差范围 X
// cin >> m >> X; // 读取目标值和误差范围
//
// // 遍历数组,计算与 m 的差的绝对值
// for (int i = 0; i < N; ++i) {
// if (abs(arr[i] - m) <= X) { // 如果差的绝对值小于等于 X
// count++; // 符合条件,计数器加 1
// }
// }
//
// cout << count << endl; // 输出符合条件的数的个数
//
// return 0;
//}
////第 2 题 问答题
////全在其中
////你设计了一个新的加密技术,可以用一种聪明的方式在一个字符串的字符间插入随机的字符串从而对信息进行
////编码。由于专利问题,我们将不会详细讨论如何在原有信息中产生和插入字符串。不过,为了验证你的方法,
////有必要写一个程序来验证原来的信息是否全在最后的字符串之中。
////给定两个字符串s和t,你需要判断s是否是t的“子列”。也就是说,如果你去掉t中的某些字符,剩下字符将连接
////而成为s。
////时间限制:1000
////内存限制:65536
////输入
////输入包括多个测试样例。每一个都是由空格分隔的由字母数字ASCII字符组成的两个特定的字符串s和t。s和t的
////长度不超过100000
////输出
////对于每个测试样例,如果s是t的“子列”,则输出”Yes”,否则输出”No"
////样例输入
////sequence subsequence
////person compression
////VERDI
////vivaVittorioEmanueleReDiItalia
////caseDoesMatter CaseDoesMatter
////样例输出
////Yes
////No
////Yes
////No
//bool isSubStr(const string& s, const string& t) {
// int j = 0; // 指向 t 的指针,保持位置
// for (int i = 0; i < s.length(); ++i) {
// bool isFind = false; // 标记是否找到当前字符
// for (; j < t.length(); ++j) { // 从上次结束的地方继续查找
// if (s[i] == t[j]) {
// isFind = true; // 找到匹配
// j++; // 移动 t 的指针到下一个位置
// break; // 跳出内层循环
// }
// }
// if (!isFind) {
// return false; // 如果没找到,返回 false
// }
// }
// return true; // 如果所有字符都找到,返回 true
//}
//bool isSubStr(const string& s, const string& t) {
// int i = 0, j = 0; // 初始化两个指针
// while (i < s.length() && j < t.length()) { // 遍历两个字符串
// if (s[i] == t[j]) { // 如果字符匹配
// i++; // 移动 s 的指针
// }
// j++; // 无论匹配与否都移动 t 的指针
// }
// return i == s.length(); // 检查是否匹配完整个 s
//}
//
//int main() {
// string s, t; // 用于存储输入的两个字符串
// while (cin >> s >> t) { // 持续读取输入直到 EOF
// if (isSubStr(s, t)) { // 判断 s 是否是 t 的子列
// cout << "Yes" << endl; // 是子列,输出 Yes
// } else {
// cout << "No" << endl; // 不是子列,输出 No
// }
// }
// return 0;
//}
////第 3 题 问答题
////Lab杯
////“Lab杯”乒乓球赛就要在PKU的实验室之间举行了。人工智能实验室的学生都是乒乓球的狂热分子,都强烈希
//// 望代表实验室去比赛。但是由于名额限制,他们之中只能由一个人被选作代表。
////为了让选择的过程公平,他们决定打一次单循环赛,每一对学生之间都打一场五局三胜的比赛。赢得最多比赛
////的人就将代表实验室去比赛。现在Ava手里有一份表,表里面记录了每一场比赛的比分。她应该让谁去比赛?
////时间限制:5000
////内存限制:131072
////输入
////输入包含一组测试数据。第一行包含n(2 ≤ n ≤ 100),实验室里学生的数目。接下来给出一个n × n矩阵A。
////矩阵的每一个元素都是0、1、2、3中的一个。第i行第j列的元素aij是第i个学生在和第j个学生的比赛中赢的局
////数。aij 和aji (i ≠ j)正好有一个是3,另外一个小于3。矩阵的所有对角线元素都是0。
////输出
////输出赢了最多比赛的学生的编号。如果有平分,选择编号最小的。
////样例输入
////4
////0 0 3 2
////3 0 3 1
////2 2 0 2
////3 3 3 0
////样例输出
////4
//int main() {
// int n; // 学生人数
// cin >> n; // 从输入中读取学生人数
//
// // 创建一个 n x n 的矩阵,表示比赛结果
// vector<vector<int>> arr(n, vector<int>(n));
//
// int maxWins = -1; // 记录最多胜利场次
// int id = 0; // 记录获胜最多的学生编号
//
// for (int i = 0; i < n; ++i) {
// int wins = 0; // 当前学生的胜利场次
// for (int j = 0; j < n; ++j) {
// cin >> arr[i][j]; // 读取比赛结果
// if (arr[i][j] == 3) { // 如果 i 赢得比赛
// wins++; // 增加胜利场次
// }
// }
// if (wins > maxWins) { // 如果当前学生胜利场次更多
// maxWins = wins; // 更新最多胜利场次
// id = i + 1; // 更新获胜最多的学生编号
// }
// }
//
// cout << id << endl; // 输出获胜最多的学生编号
// return 0;
//}
////第 4 题 问答题
////有趣的跳跃
////一个长度为n(n>0)的序列中存在“有趣的跳跃”当且仅当相邻元素的差的绝对值经过排序后正好是从1到(n-
////1)。例如,1 4 2 3存在“有趣的跳跃”,因为差的绝对值分别为3,2,1。当然,任何只包含单个元素的序列一定存
////在“有趣的跳跃”。你需要写一个程序判定给定序列是否存在“有趣的跳跃”。
////时间限制:1000
////内存限制:65536
////输入
////一行,第一个数是n(0 < n < 3000),为序列长度,接下来有n个整数,依次为序列中各元素,各元素的绝对
////值均不超过1,000,000,000
////输出
////一行,若该序列存在“有趣的跳跃”,输出"Jolly",否则输出"Not jolly"
////样例输入
////4 1 4 2 3
////样例输出
////Jolly
//int main() {
// int n; // 序列长度
// cin >> n; // 从输入中读取序列长度
//
// vector<int> arr(n); // 创建一个大小为 n 的 vector 用于储存序列中的每个元素
// for (int i = 0; i < n; ++i) {
// cin >> arr[i]; // 读取序列中的每个元素
// }
//
// if (n == 1) { // 如果序列长度为 1
// cout << "Jolly" << endl; // 单元素序列默认是 Jolly
// return 0; // 提前结束程序
// }
//
// vector<int> arrAbs(n - 1); // 用于存储相邻元素差的绝对值
// for (int i = 1; i < n; ++i) {
// arrAbs[i - 1] = abs(arr[i] - arr[i - 1]); // 计算绝对差并存储
// }
//
// sort(arrAbs.begin(), arrAbs.end()); // 对绝对差排序
//
// // 检查排序后的差是否是 1 到 n-1 的连续序列
// for (int i = 0; i < n - 1; ++i) {
// if (arrAbs[i] != i + 1) { // 如果差值不连续
// cout << "Not jolly" << endl; // 输出 Not jolly
// return 0; // 提前结束程序
// }
// }
//
// cout << "Jolly" << endl; // 差值连续,输出 Jolly
// return 0;
//}
//第 5 题 问答题
//反反复复
//Mo和Larry发明了一种信息加密方法。他们首先决定好列数,然后将信息(只包含字母)从上往下依次填入各
//列,并在末尾补充一些随机字母使其成为一个完整的字母矩阵。例如,若信息是“There's no place like home
//on a snowy night”并且有5列,Mo会写成:
//t o i o y
//h p k n n
//e l e a i
//r a h s g
//e c o n h
//s e m o t
//n l e w x
//注意Mo只会填入字母,且全部是小写形式。在这个例子中,Mo用字母“x”填充了信息使之成为一个完整的矩
//阵,当然他使用任何字母都是可以的。
//Mo根据这个矩阵重写信息:首先从左到右写下第一行,然后从右到左写下第二行,再从左到右写下第三
//行……以此左右交替地从上到下写下各行字母,形成新的字符串。这样,例子中的信息就被加密为:
//toioynnkpheleaigshareconhtomesnlewx。
//你的工作是帮助Larry从加密后的信息中还原出原始信息(包括填充的字母)。
//时间限制:1000
//内存限制:65536
//输入
//第一行包含一个整数(范围2到20),表示使用的列数。 第二行是一个长度不超过200的字符串。
//输出
//一行,即原始信息。
//样例输入
//5
//toioynnkpheleaigshareconhtomesnlewx
//样例输出
//theresnoplacelikehomeonasnowynightx
//int main() {
// int col; // 列数
// string str; // 加密后的字符串
// cin >> col >> str; // 从输入中读取列数和加密后的字符串
//
// // 计算行数,矩阵的行数为字符串长度除以列数
// int row = str.length() / col;
//
// // 创建一个二维 vector 来表示矩阵,行数为 row,列数为 col
// vector<vector<char>> matrix(row, vector<char>(col));
//
// int pos = 0; // 记录当前读取字符串的位置
// for (int i = 0; i < row; ++i) { // 遍历每一行
// if (i % 2 == 0) { // 如果行数是偶数
// for (int j = 0; j < col; ++j) { // 从左到右填充
// matrix[i][j] = str[pos++]; // 填充矩阵并更新 pos
// }
// } else { // 如果行数是奇数
// for (int j = col - 1; j >= 0; --j) { // 从右到左填充
// matrix[i][j] = str[pos++]; // 填充矩阵并更新 pos
// }
// }
// }
//
// // 按列顺序输出矩阵,重构原始信息
// for (int j = 0; j < col; ++j) { // 遍历每一列
// for (int i = 0; i < row; ++i) { // 遍历每一行
// cout << matrix[i][j]; // 输出矩阵中的字符
// }
// }
// return 0;
//}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2022.12.iml" filepath="$PROJECT_DIR$/.idea/C++-2022.12.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,300 @@
//
// Created by xiaolinquan on 2024/11/22.
//
#include <bits/stdc++.h>
using namespace std;
////第 1 题 问答题
////数组逆序重放
////将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。
////输入
////输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每两个整数之间用空格分隔。
////输出
////输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。
////样例输入
////5
////8 6 5 4 1
////样例输出
////1 4 5 6 8
//int main() {
// int n; // 输入的数组大小
// cin >> n;
// // 定义一个大小为 n 的动态数组
// vector<int> arr(n);
//
// // 输入数组元素
// for (int i = 0; i < n; ++i) {
// cin >> arr[i];
// }
//
// // 对数组进行升序排序
// sort(arr.begin(), arr.end());
// // 输出排序后的数组,确保格式正确
// for (int i = 0; i < n; ++i) {
// if (i > 0) {
// cout << " "; // 在输出多个元素时添加空格
// }
// cout << arr[i];
// }
// return 0;
//}
////第 2 题 问答题
////最长最短单词
////输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连
////续的字母构成,空格和逗号都是单词间的间隔。
////试输出第1个最长的单词和第1个最短单词。
////输入
////一行句子。
////输出
////两行输出: 第1行,第一个最长的单词。 第2行,第一个最短的单词。
////样例输入
///I am studying Programming language C in Peking University
////样例输出
////Programming
////I
//int main() {
// string input;
// getline(cin, input); // 输入整行句子
// int maxLen = INT_MIN, minLen = INT_MAX; // 初始化最长和最短长度
// string maxStr, minStr; // 初始化最长和最短单词
// int start = 0; // 当前单词起始位置
//
// // 遍历整个字符串
// for (int i = 0; i <= input.size(); ++i) {
// // 判断是否遇到单词分隔符(空格、逗号或字符串末尾)
// if (input[i] == ' ' || input[i] == ',' || input[i] == '\0') {
// if (i > start) { // 确保不是连续的多个空分隔符
// int wordLen = i - start; // 计算当前单词长度
// string word = input.substr(start, wordLen); // 提取单词
// // 更新最长单词
// if (wordLen > maxLen) {
// maxLen = wordLen;
// maxStr = word;
// }
// // 更新最短单词
// if (wordLen < minLen) {
// minLen = wordLen;
// minStr = word;
// }
// }
// start = i + 1; // 更新下一个单词的起始位置
// }
// }
//
// // 输出结果
// cout << maxStr << endl; // 输出第一个最长单词
// cout << minStr << endl; // 输出第一个最短单词
// return 0;
//}
////第 3 题 问答题
////计算鞍点
////给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。 鞍点指的是矩阵中
////的一个元素,它是所在行的最大值,并且是所在列的最小值。 例如:在下面的例子中(第4行第1列的元素就
////是鞍点,值为8 )。
////11 3 5 6 9
////12 4 7 8 10
////10 5 6 9 11
////8 6 4 7 2
////15 10 11 20 25
////输入
////输入包含一个5行5列的矩阵
////输出
////如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"
////样例输入
////11 3 5 6 9
////12 4 7 8 10
////10 5 6 9 11
////8 6 4 7 2
////15 10 11 20 25
////样例输出
////4 1 8
// 判断是否是鞍点
//bool isAndian(int arr[5][5], int num, int row, int col) {
// // 检查是否是所在行的最大值
// for (int i = 0; i < 5; ++i) {
// if (arr[row][i] > num) {
// return false;
// }
// }
// // 检查是否是所在列的最小值
// for (int i = 0; i < 5; ++i) {
// if (arr[i][col] < num) {
// return false;
// }
// }
// return true;
//}
//
//int main() {
// int arr[5][5];
// // 输入 5x5 矩阵
// for (int i = 0; i < 5; ++i) {
// for (int j = 0; j < 5; ++j) {
// cin >> arr[i][j];
// }
// }
//
// // 遍历矩阵中的每个元素
// for (int i = 0; i < 5; ++i) {
// for (int j = 0; j < 5; ++j) {
// if (isAndian(arr, arr[i][j], i, j)) {
// cout << i + 1 << " " << j + 1 << " " << arr[i][j] << endl;
// return 0; // 找到后直接结束
// }
// }
// }
//
// // 如果没有找到鞍点,输出 "not found"
// cout << "not found" << endl;
// return 0;
//}
////第 4 题 问答题
////病人排队
////病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
////1. 老年人(年龄 >= 60岁)比非老年人优先看病。
////2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
////3. 非老年人按登记的先后顺序看病。
////输入
////第1行,输入一个小于100的正整数,表示病人的个数; 后面按照病人登记的先后顺序,每行输入一个病人的
////信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数
////表示病人的年龄,中间用单个空格隔开。
////输出
////按排好的看病顺序输出病人的ID,每行一个。
////样例输入
////5
////021075 40
////004003 15
////010158 67
////021033 75
////102012 30
////
////样例输出
////021033
////010158
////021075
////004003
////102012
//void insertSort(list<pair<string, int> >& vec, int age, string id){
// for(auto v : vec){
//
// }
//}
//// 函数返回true代表a小于b,而小的会排在前面,即函数返回true代表a排在b的前面
//// 则自定义排序规则:优先按年龄从大到小排序,若年龄相同按输入顺序
//// list的 sort()函数是稳定排序算法,其中如果两个元素相等,它们在排序后将保持原来的顺序
//bool compare(const pair<string, int>& a, const pair<string, int>& b) {
// return a.second > b.second; // 年龄大的排在前面
//}
//
//int main() {
// int N; // 病人数量
// cin >> N;
//
// list<pair<string, int>> oldList; // 存储老年人(>=60岁)
// queue<string> youngQueue; // 存储非老年人
//
// // 输入病人信息
// for (int i = 0; i < N; ++i) {
// string id;
// int age;
// cin >> id >> age;
//
// if (age >= 60) {
// oldList.push_back({id, age}); // 老年人加入列表
// } else {
// youngQueue.push(id); // 非老年人加入队列
// }
// }
// // 对老年人按年龄排序
// oldList.sort(compare);
//
// // 输出老年人顺序
// for (const auto& p : oldList) {
// cout << p.first << endl;
// }
//
// // 输出非老年人顺序
// while (!youngQueue.empty()) {
// cout << youngQueue.front() << endl;
// youngQueue.pop();
// }
// return 0;
//}
//// 第 5 题 问答题
//// 循环数
//// 若一个n位的数字串满足下述条件,则称其是循环数(cyclic):将这个数字串视为整数(可能带有前导0),
//// 并用任意一个 1 到 n 之间(包含1和n)的整数去乘它时, 会得到一个将原数字串首尾相接后,再在某处断开而
//// 得到的新数字串所对应的整数。例如,数字 142857 是循环数,因为:
//// 142857 *1 = 142857
//// 142857 *2 = 285714
//// 142857 *3 = 428571
//// 142857 *4 = 571428
//// 142857 *5 = 714285
//// 142857 *6 = 857142。
//// 请写一个程序判断给定的数是否是循环数。
//// 注意:在此题中,输入数字串允许带前导0,且前导0不能被忽略,例如“01”是两位数字串,而“1”是一位数字
//// 串。但将数字串转化为整数做乘法运算或比较运算时,可以忽略前导0。
//// 时间限制:10000
//// 内存限制:65536
//// 输入
//// 一行,一个长度在 2 到 60 位之间的数字串。
//// 输出
//// 一个整数,若输入的数字串是循环数,输出1,否则输出0。
//// 样例输入
//// 142857
//// 样例输出
//// 1
// 检查sub是否是str的子串,手动实现
//bool isSubstring(const string& str, const string& sub) {
// int n = str.size();
// int m = sub.size();
// if (m > n) return false; // 子串长度大于主串,直接返回false
//
// for (int i = 0; i <= n - m; ++i) { // 遍历每一个可能的起始位置
// bool match = true;
// for (int j = 0; j < m; ++j) { // 对于每个起始位置,检查完整的子串
// if (str[i + j] != sub[j]) {
// match = false;
// break; // 一旦发现不匹配,立即中断内部循环
// }
// }
// if (match) return true; // 如果完全匹配,返回true
// }
// return false; // 如果所有起始位置都不匹配,返回false
//}
//
//// 检查一个数字串是否是循环数
//bool isCyclicNumber(const string& num) {
// int n = num.size();
// string doubleNum = num + num; // 创建原字符串的双倍字符串
//
// for (int i = 1; i <= n; ++i) {
// long long multipliedNumber = stoll(num) * i; // 使用乘法后的数字
// string multipliedStr = to_string(multipliedNumber);
//
// // 手动检查multipliedStr是否是doubleNum的子串
// if (!isSubstring(doubleNum, multipliedStr)) {
// return false; // 如果在任何点找不到匹配,返回false
// }
// }
// return true; // 找到了匹配的字串,代表是循环数,返回true
//}
//
//int main(){
// string n;
// cin >> n;
// cout << isCyclicNumber(n);
//}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2023.03.iml" filepath="$PROJECT_DIR$/.idea/C++-2023.03.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,292 @@
//
// Created by xiaolinquan on 2024/11/26.
//
#include <bits/stdc++.h>
using namespace std;
//第 1 题 问答题
//数字字符求和
//请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。
//时间限制:1000
//内存限制:65536
//输入
//一行字符串,长度不超过100,字符串中不含空格。
//输出
//字符串中所有数字字符作为数的和
//样例输入
//Lsd2f02k3ja3sdf223
//样例输出
//17
//int main() {
// string input;
// cin >> input; // 读取输入的字符串
//
// int sum = 0; // 初始化求和变量
// // 遍历字符串中的每个字符
// for (char c : input) {
// // 如果当前字符是数字
// if (isdigit(c)) {
// sum += c - '0'; // 直接转换为整数并累加
// }
// }
//
// cout << sum << endl; // 输出数字字符的和
// return 0;
//}
//第 2 题 问答题
//简单密码(2023.3)
//Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后5位对应的字符来
//代替,这样就得到了密文。比如字符A用F来代替。如下是密文和明文中字符的对应关系。 密文 A B C D E F
//G H I J K L M N O P Q R S T U V W X Y Z 明文 V A W X Y Z B C D E F G H I J K L M N O P Q R S
//T U 你的任务是对给定的密文进行解密得到明文。 你需要注意的是,密文中出现的字母都是大写字母。密文
//中也包括非字母的字符,对这些字符不用进行解码。
//时间限制:1000
//内存限制:65536
//输入
//一行,给出密文,密文不为空,而且其中的字符数不超过200。
//输出
//输出一行,即密文对应的明文。
//样例输入
//NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
//样例输出
//IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
//int main(){
// string str;
// getline(cin, str);
//
// for(auto& c : str){
// if(c >= 'A' && c <= 'Z'){
// char new_ch = ((c - 'A' + 21) % 26) + 'A'; // 映射关系:c - 5 + 26
// cout << new_ch;
// }else{
// cout << c;
// }
// }
// return 0;
//}
// 第 3 题 问答题
// 进阶的卡莎
// 虚空之女·卡莎考入了战斗学院,她的父亲虚空行者·卡萨丁要检查她的考试成绩。已知卡莎一段时间内的成绩
// 序列,请你帮卡萨丁计算卡莎在这段时间内最长的成绩连续上升(相等不算做连续上升)的长度。
// 例如,给出卡莎的成绩序列是85 90 80 85 90 95 95 80 75 75,其中连续上升序列包括“85 90”和“80 85 90
// 95”两组,后者是最长的连续上升成绩序列(相等不算做连续上升),应该输出后者的长度4。
// 时间限制:1000
// 内存限制:65536
// 输入
// 输入的第一行是序列的长度N(1 <= N <= 100)。 第二行给出序列中的N个整数,这些整数的取值范围都在0到
// 100。
// 输出
// 最长的成绩连续上升的长度(相等不算做连续上升)。
// 样例输入
// 10
// 85 90 80 85 90 95 95 80 75 75
// 样例输出
// 4
//int main() {
// int N;
// cin >> N; // 读取成绩数量
//
// vector<int> scores(N); // 存储成绩
// for (int i = 0; i < N; ++i) {
// cin >> scores[i]; // 读取每个成绩
// }
//
// int max_increasing_length = 1, current_increasing_length = 1;
// // 从第二个成绩开始遍历
// for (int i = 1; i < N; ++i) {
// // 如果当前成绩高于前一个成绩
// if (scores[i] > scores[i - 1]) {
// current_increasing_length++;
// } else {
// current_increasing_length = 1; // 重置当前长度
// }
// // 更新最长连续上升长度
// max_increasing_length = max(max_increasing_length, current_increasing_length);
// }
//
// cout << max_increasing_length << endl; // 输出最长连续上升长度
// return 0;
//}
//第 4 题 问答题
//合影效果(2023.3)
//小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的
//角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合
//影的效果是什么样的(所有人的身高都不同)?
//时间限制:1000
//内存限制:65536
//输入
//第一行是人数n(2 <= n <= 40,且至少有1个男生和1个女生)。 后面紧跟n行,每行输入一个人的性别(男
//male或女female)和身高(浮点数,单位米),两个数据之间以空格分隔。
//输出
//n个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点数需保留到小数点后2位,相邻两个
//数之间用单个空格隔开。
//样例输入
//6
//male 1.72
//male 1.78
//female 1.61
//male 1.65
//female 1.70
//female 1.56
//样例输出
//1.65 1.72 1.78 1.70 1.61 1.56
//int main(){
// int N;
// cin >> N;
// vector<double> male_height;
// vector<double> female_height;
// // 读取每个人性别和身高
// for(int i = 0; i < N; ++i){
// string gender;
// double height;
// cin >> gender >> height;
// if(gender == "male"){
// male_height.push_back(height);
// }else{
// female_height.push_back(height);
// }
// }
// // 男生从矮到高,女生从高到低
// sort(male_height.begin(), male_height.end());
// sort(female_height.begin(), female_height.end(), greater<>());
// for(auto& i : male_height){
// cout << fixed << setprecision(2) << i << " ";
// }
//
// bool first = true;
// for(auto& i : female_height){
// if(!first){
// cout << " ";
// }
// cout << i;
// first = false;
// }
//}
// 第 5 题 问答题
// 割圆
// 本题将实现一个简化版的“割圆”游戏。成功点亮所有灯时,联结第一个和最后一个灯称之为“割线”。
// n盏灯环形分布,顺序编号为1到n。灯的初始状态为关闭不亮。假设n为7,则第1号灯与第2、7号灯相邻,第2
// 号灯与第1、3号灯相邻,以此类推。
// 灯的点亮规则如下:
// 1、输入m个数,每个数为某个灯的编号,可能重复或只是部分编号;
// 2、m个数中的第1个数所对应的灯,默认点亮;
// 3、如果输入数对应灯的左侧或右侧已被点亮,则点亮自身。否则啥也不做;
// 4、如果所有的灯都已被点亮,则程序结束,m个数中尚未被处理的数将不再处理;
// 5、输出第1次和最后一次点亮灯的编号;
// 6、如果m个数处理完毕尚未点亮所有灯,则输出No。
// 时间限制:1000
// 内存限制:131072
// 输入
// 第一行2个整数n,m,保证3<=n<=1000,1<=m<=10000。 第二行m个数,每个数都在1到n之间,表示输入
// 序列。
// 输出
// 如果完成了“割圆”,则输出两个整数,之间用一个空格隔开,否则输出No。
// 样例输入
// 7 10
// 2 3 1 7 5 6 5 4 4 2
// 样例输出
// 2 4
//int main() {
// int n, m;
// cin >> n >> m; // 读取灯的数量和输入序列长度
// vector<int> light(n, 0); // 初始化灯的状态
//
// int first_lit = -1, last_lit = -1; // 记录第一次和最后一次点亮的灯编号
// bool game_over = false; // 游戏是否结束
//
// for (int i = 0; i < m; ++i) {
// int id;
// cin >> id;
// id--; // 调整编号从0开始
//
// // 如果是第一次点亮灯
// if (first_lit == -1) {
// first_lit = id;
// light[id] = 1;
// continue;
// }
//
// // 检查并点亮灯
// if (id == 0) {
// if (light[n - 1] || light[1]){
// light[id] = 1;
// }
// } else if (id == n - 1) {
// if (light[n - 2] || light[0]){
// light[id] = 1;
// }
// } else {
// if (light[id - 1] || light[id + 1]){
// light[id] = 1;
// }
// }
//
// // 如果所有灯都被点亮
// if (find(light.begin(), light.end(), 0) == light.end()) {
// last_lit = id;
// game_over = true;
// break;
// }
// }
//
// if (game_over){
// cout << first_lit + 1 << " " << last_lit + 1 << endl;
// }else{
// cout << "No" << endl;
// }
// return 0;
//}
// 还可使用另外一种方法
//int main() {
// int n, m;
// cin >> n >> m; // 读取灯的数量和输入序列长度
// vector<int> light(n, 0); // 初始化灯的状态
//
// int first_lit = -1, last_lit = -1; // 记录第一次和最后一次点亮的灯编号
// bool game_over = false; // 游戏是否结束
//
// for (int i = 0; i < m; ++i) {
// int id;
// cin >> id;
// id--; // 调整编号从0开始
//
// // 如果是第一次点亮灯
// if (first_lit == -1) {
// first_lit = id;
// light[id] = 1;
// continue;
// }
//
// // 检查并点亮灯
// int left = (id - 1 + n) % n;
// int right = (id + 1) % n;
// if (light[left] || light[right]) {
// light[id] = 1;
// last_lit = id;
// }
//
// // 如果所有灯都被点亮
// if (find(light.begin(), light.end(), 0) == light.end()) {
// game_over = true;
// break;
// }
// }
//
// if (game_over) {
// cout << first_lit + 1 << " " << last_lit + 1 << endl;
// } else {
// cout << "No" << endl;
// }
// return 0;
//}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/C++-2023.05.iml" filepath="$PROJECT_DIR$/.idea/C++-2023.05.iml" />
</modules>
</component>
</project>
@@ -0,0 +1,238 @@
//
// Created by xiaolinquan on 2024/11/27.
//
#include <bits/stdc++.h>
using namespace std;
//第 1 题 问答题
//数字放大
//给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。
//时间限制:1000
//内存限制:65536
//输入
// 包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间
// 以一个空格分开; 第三行包含一个整数(不超过整型范围),为指定的整数x。
//输出
//N个整数,为原序列放大之后的序列,整数之间以一个空格分开。
//样例输入
//3
//1 5 7
//2
//样例输出
//2 10 14
//int main() {
// int N;
// cin >> N; // 输入整数序列的长度
// long long arr[N]; // 使用 VLA(可变长数组)存储整数序列
// for (int i = 0; i < N; ++i) {
// cin >> arr[i]; // 输入每个整数
// }
// int x;
// cin >> x; // 输入放大倍数
// for (int i = 0; i < N; ++i) {
// cout << arr[i] * x; // 输出放大后的结果
// if (i != N - 1) cout << " "; // 确保数字之间有空格,最后一个数字后无空格
// }
// cout << endl;
// return 0;
//}
//第 2 题 问答题
//单词倒排(2023年5月二级)
//编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然
//以单个空格分隔。
//时间限制:10000
//内存限制:65536
//输入
//输入为一个字符串(字符串长度至多为100)。
//输出
//输出为按要求排序后的字符串。
//int main() {
// string input;
// getline(cin, input); // 读取一整行输入
// stringstream ss(input); // 使用 stringstream 以便分割单词
// vector<string> words;
// string word;
// while (ss >> word) { // 逐个读取单词
// words.push_back(word); // 将单词存入 vector
// }
//
// for (int i = words.size() - 1; i >= 0; i--) { // 倒序输出单词
// cout << words[i];
// if (i > 0) cout << " "; // 控制单词间的空格
// }
// cout << endl;
// return 0;
//}
//第 3 题 问答题
//计算矩阵边缘元素之和
//输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及
//第一列和最后一列的元素。
//时间限制:10000
//内存限制:65536
//输入
//第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。 接下来输入的m行数
//据中,每行包含n个整数,整数之间以一个空格分开。
//输出
//输出对应矩阵的边缘元素和
//样例输入
//3 3
//3 4 1
//3 7 1
//2 0 1
//样例输出
//15
//int main() {
// int m, n;
// cin >> m >> n; // 输入矩阵的行数和列数
// vector<vector<int>> arr(m, vector<int>(n)); // 使用 vector 创建二维数组
// int sum = 0;
// for (int i = 0; i < m; ++i) {
// for (int j = 0; j < n; ++j) {
// cin >> arr[i][j]; // 输入矩阵元素
// // 判断是否为边缘元素
// if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
// sum += arr[i][j]; // 累加边缘元素
// }
// }
// }
// cout << sum << endl; // 输出边缘元素之和
// return 0;
//}
//第 4 题 问答题
//奇数单增序列
//给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。
//时间限制:1000
//内存限制:65536
//输入
//共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。
//输出
//增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。
//样例输入
//10
//1 3 2 6 5 4 9 8 7 10
//样例输出
//1,3,5,7,9
//int main() {
// int N;
// cin >> N; // 输入序列长度
// vector<int> odds; // 存储奇数的向量
// for (int i = 0; i < N; ++i) {
// int num;
// cin >> num; // 输入序列中的每个数字
// if (num % 2 != 0) { // 判断是否为奇数
// odds.push_back(num); // 是奇数则添加到向量中
// }
// }
// sort(odds.begin(), odds.end()); // 对奇数进行排序
// for (size_t i = 0; i < odds.size(); ++i) {
// if (i > 0) cout << ","; // 控制逗号输出,除第一个数外前面都加逗号
// cout << odds[i];
// }
// cout << endl;
// return 0;
//}
// 第 5 题 问答题
// 实数加法
// 求两个实数相加的和。
// 题目中输入输出里出现的浮点数都有如下的形式: P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非
// 负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。
// 时间限制:1000
// 内存限制:65536
// 输入
// 2行,每行是一个加数。每个加数的长度不超过100。
// 输出
// 一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
// 样例输入
// 0.111111111111111111111111111111
// 0.111111111111111111111111111111
// 样例输出
// 0.222222222222222222222222222222
//// 辅助函数:反转字符串并在末尾补零以对齐
//void reverseAndPad(string &s, long long newSize) {
// reverse(s.begin(), s.end()); // 反转字符串,方便从低位开始加
// s.resize(newSize, '0'); // 补齐字符串到指定长度,填充字符为 '0'
//}
//
//int main() {
// string num1, num2;
// cin >> num1 >> num2; // 输入两个实数字符串
//
// // 找到小数点位置
// int num1_point_pos = num1.find('.'); // 找到第一个数的小数点位置
// int num2_point_pos = num2.find('.'); // 找到第二个数的小数点位置
//
// // 分离整数部分和小数部分
// string num1_p, num1_q, num2_p, num2_q;
//
// // 处理第一个数的整数和小数部分
// if (num1_point_pos != string::npos) {
// num1_p = num1.substr(0, num1_point_pos); // 提取整数部分
// num1_q = num1.substr(num1_point_pos + 1); // 提取小数部分
// } else {
// num1_p = num1; // 如果没有小数点,全部为整数部分
// num1_q = ""; // 小数部分为空
// }
//
// // 处理第二个数的整数和小数部分
// if (num2_point_pos != string::npos) {
// num2_p = num2.substr(0, num2_point_pos); // 提取整数部分
// num2_q = num2.substr(num2_point_pos + 1); // 提取小数部分
// } else {
// num2_p = num2; // 如果没有小数点,全部为整数部分
// num2_q = ""; // 小数部分为空
// }
//
// // 处理小数部分:反转并补齐到相同长度
// long long maxDecimalLength = max(num1_q.size(), num2_q.size()); // 找到最大的小数长度
// reverseAndPad(num1_q, maxDecimalLength); // 反转并补齐第一个数的小数部分
// reverseAndPad(num2_q, maxDecimalLength); // 反转并补齐第二个数的小数部分
//
// string res_q; // 存储小数部分的结果
// int carry = 0; // 进位
//
// // 逐位相加小数部分
// for (long long i = 0; i < maxDecimalLength; ++i) {
// int sum = (num1_q[i] - '0') + (num2_q[i] - '0') + carry; // 计算当前位的和
// res_q.push_back((sum % 10) + '0'); // 将结果的当前位加入结果字符串
// carry = sum / 10; // 更新进位
// }
// reverse(res_q.begin(), res_q.end()); // 恢复小数部分的顺序
//
// // 处理整数部分:反转并补齐到相同长度
// reverse(num1_p.begin(), num1_p.end()); // 反转第一个数的整数部分
// reverse(num2_p.begin(), num2_p.end()); // 反转第二个数的整数部分
// size_t maxIntegerLength = max(num1_p.size(), num2_p.size()); // 找到最大整数长度
// num1_p.resize(maxIntegerLength, '0'); // 补齐第一个数的整数部分
// num2_p.resize(maxIntegerLength, '0'); // 补齐第二个数的整数部分
//
// string res_p; // 存储整数部分的结果
//
// // 逐位相加整数部分
// for (long long i = 0; i < maxIntegerLength; ++i) {
// int sum = (num1_p[i] - '0') + (num2_p[i] - '0') + carry; // 计算当前位的和
// res_p.push_back((sum % 10) + '0'); // 将结果的当前位加入结果字符串
// carry = sum / 10; // 更新进位
// }
//
// // 如果最后还有进位
// if (carry > 0) {
// res_p.push_back(carry + '0'); // 将最后的进位加入结果
// }
//
// reverse(res_p.begin(), res_p.end()); // 恢复整数部分的顺序
//
// // 输出结果
// cout << res_p << "." << res_q << endl; // 输出最终结果
//
// return 0;
//}
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
Loaded 100 of 1789 files, more files were not shown because too many files have changed in this diff. Show more