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

2025_11_8_刷题

2025_11_8_刷题

文章目录

  • 2025_11_8_刷题
    • 一、前言
    • 二、刷题
      • 2.1
        • 2.1.1 分析题目
        • 2.1.2 思维发散
        • 2.1.3 思路整理
        • 2.1.4 代码
        • 2.1.5 总结
      • 2.2
        • 2.2.1 分析题目
        • 2.2.2 思维发散
        • 2.2.3 思路整理
        • 2.2.4 代码
        • 2.2.5 总结
      • 2.3
        • 2.3.1 分析题目
        • 2.3.2 思维发散
        • 2.3.3 思路整理
        • 2.3.4 代码
        • 2.3.5 总结
      • 2.4
        • 2.4.1 分析题目
        • 2.4.2 思维发散
        • 2.4.3 思路整理
        • 2.4.4 代码
        • 2.1.5 总结
    • 三、小结

一、前言

今天是刷题的第四天,看看主攻是什么方向吧~

二、刷题

2.1

——计挑赛2020年C++组真题

某校进行了一场月考,考试科目为:物理、化学、生物,每科的满分都是一百分。考试结束后老师想找出理科综合能力较强的3名同学参加竞赛,各科权重为40%,35%,25%,按权重计算总分(加权总分结果四舍五入保留到小数第一位)。若总分相同则按照物理、化学、生物优先级进行得分高低的排序。

输入: 第一行,一个整数n,表示参加考试的学生的数量。3<=N<=500。 接下来n行,每行第一个为学生学号(8位数字),后面跟着三个用空格隔开的整数,分别表示该学生三个科目的得分情况,每个整数都是0到100之间。

输出: 分三行分别输出理科综合能力较强的3名同学的学号信息及加权后的总分(保留到小数点后1位)。

样例输入:5
20200001 93 79 84
20200002 97 86 88
20200003 78 95 78
20200004 76 84 86
20200005 65 84 94

样例输出:
20200002 90.9
20200001 85.9
20200003 84.0


2.1.1 分析题目

计算学生加权之后的成绩,并取出前3名

2.1.2 思维发散

既然是学生学号和学生成绩是一起的,我想定义一个结构体来存储。

定义一个计算总分的函数

2.1.3 思路整理
  • 定义一个结构体
  • 定义一个计算加权总分的函数
  • 定义冒泡排序
  • 输入输出
2.1.4 代码
#include<iostream>
#include<cstdio>
using namespace std;
// 定义学生结构体
struct Student
{char num[10];int ph;int che;int bio;double scores;
};int n;
// 计算加权之和
double sum(int a, int b, int c)
{return a * 0.4 + b * 0.35 + c * 0.25;
}
// 冒泡排序
void bubbleSort(Student s[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (s[j].scores < s[j + 1].scores) {Student temp = s[j];s[j] = s[j + 1];s[j + 1] = temp;}}}
}int main()
{cin >> n;Student students[10];for(int i = 0; i < n; i++){cin >> students[i].num >> students[i].ph >> students[i].che >> students[i].bio;students[i].scores = sum(students[i].ph, students[i].che, students[i].bio);}bubbleSort(students, n);// 输出前三名int count = (n < 3) ? n : 3;		// 注意考虑数据范围for(int i = 0; i < count; i++){printf("%s %.1f\n", students[i].num, students[i].scores);}return 0;
}

结果

在这里插入图片描述

2.1.5 总结

很简单~

排序算法还能继续优化,不过考场上写自己最熟悉的那个

过几天我会补上排序算法的博客~

2.2

——计挑赛2020年C++组真题

某校进行了一场月考,考试试卷上只有三种题型:选择题、填空题、应用题,每种题型的满分都是一百分。考试结束后,老师想知道各题型最高分的学生姓名,以及总分前三名同学的成绩和学生学号。若总分相同则按照应用题、填空题、选择题优先级递减的方式排序,如果仍相同,按学号从小到大排序。

输入: 第一行,一个整数n,表示参加考试的学生的数量。3<=N<=500。 接下来n行,每行第一个为学生学号(8位数字),后面跟着三个用空格隔开的整数,分别表示该学生三种题型的得分情况,每个整数都是0到100之间。

输出: 分三行分别输出选择题、填空题和应用题最高分的学生姓名和分数,每一个题型最高的学学号和成绩占一行,之间以空格隔开。 第四行:换行 后三行,输出总分排名前三的同学的学号和总成绩,每个同学学号和成绩占一行,之间以空格隔开。

样例输入: 5
20200001 89 78 84
20200002 97 86 88
20200003 87 95 78
20200004 76 84 86
20200005 88 84 94

样例输出
20200002 97
20200003 95
20200005 94
20200002 271
20200005 266
20200003 260


2.2.1 分析题目

题目升级:需要求出单项的最高成绩和总分(未加权)的前三名

2.2.2 思维发散

这里需要排序的不只一项,排序函数的针对类型有多种,但函数思路一致的情况下,可以采用模板:可以自动识别类型。

2.2.3 思路整理
  • 只是将上述代码的函数稍微改编一下:加上自动类型识别(模板)
2.2.4 代码
#include<iostream>
#include<cstdio>
using namespace std;struct Student
{char num[10];int choose;int fill;int app;int scores;
};int n;
int sum(int a, int b, int c)
{return a + b + c;
}
// 通用的冒泡排序函数模板
template<typename T>
void bubbleSort(Student s[], int n, T Student::*member) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (s[j].*member < s[j + 1].*member) {Student temp = s[j];s[j] = s[j + 1];s[j + 1] = temp;}}}
}int main()
{cin >> n;Student students[10];for(int i = 0; i < n; i++){cin >> students[i].num >> students[i].choose >> students[i].fill >> students[i].app;students[i].scores = sum(students[i].choose, students[i].fill, students[i].app);}bubbleSort(students, n, &Student::choose);printf("%s %d\n", students[0].num, students[0].choose);bubbleSort(students, n, &Student::fill);printf("%s %d\n", students[0].num, students[0].fill);bubbleSort(students, n, &Student::app);printf("%s %d\n", students[0].num, students[0].app);bubbleSort(students, n, &Student::scores);int count = (n < 3) ? n : 3;for(int i = 0; i < count; i++){printf("%s %d\n", students[i].num, students[i].scores);}return 0;
}

结果

在这里插入图片描述

2.2.5 总结

针对仅参数类型不同函数时,可以采用模板的方法~这不比函数重载强(一开始我想到的是重载)

2.3

——计挑赛2020年C++组真题

某校进行了一场月考,考试试卷上只有三种题型:选择题、填空题、应用题,每种题型的满分都是一百分。考试结束后,老师想知道各题型都在80分以上(含80分)的学生学号和总分,按总分由高到低输出。总分相同则按照应用题、填空题、选择题优先级递减的方式排序,如果仍相同,按学号从小到大排序。

输入: 第一行,一个整数n,表示参加考试的学生的数量。3<=N<=500。 接下来n行,每行第一个为学生学号(8位数字),后面跟着三个用空格隔开的整数,分别表示该同学三种题型的得分情况,每个整数都是0到100之间。

输出: 按总分由高到低,逐行输出各题型都在80分以上的学生学号和总分。 如果没有符合条件的学生,则输出NULL

样例输入: 5
20200001 89 78 84
20200002 97 86 88
20200003 87 95 78
20200004 76 84 86
20200005 88 84 94

样例输出
20200002 271
20200005 266


2.3.1 分析题目

题目再一次变化:加了一个单项成绩均大于80的条件,求这个条件下的学生排名

2.3.2 思维发散

这次的变化相对简单~

2.3.3 思路整理
  • 就是在原来的基础上,少了排序,但是需要加if条件判断
2.3.4 代码
#include<iostream>
#include<cstdio>
using namespace std;struct Student
{char num[10];int choose;int fill;int app;int scores;
};int n;
int sum(int a, int b, int c)
{return a + b + c;
}void bubbleSort(Student s[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (s[j].scores < s[j + 1].scores) {Student temp = s[j];s[j] = s[j + 1];s[j + 1] = temp;}}}
}int main()
{cin >> n;Student students[10];Student ans[10];for(int i = 0; i < n; i++){cin >> students[i].num >> students[i].choose >> students[i].fill >> students[i].app;students[i].scores = sum(students[i].choose, students[i].fill, students[i].app);}int cnt = 0;for(int i = 0; i < n; i++){if(students[i].choose > 80 && students[i].fill > 80 && students[i].app > 80){ans[cnt] = students[i];cnt++;}}bubbleSort(ans, cnt);for(int i = 0; i < cnt; i++){printf("%s %d\n", ans[i].num, ans[i].scores);}return 0;
}

结果

在这里插入图片描述

2.3.5 总结

如果加了条件限制,直接想到if判断。

2.4

——计挑赛2020年C++组真题

有一时钟在某时刻的时间为HH:MM:SS(24小时制),在经过一段时间(<24h)后,其时间变为hh:mm:ss 求其中经过了多少秒。

输入: 第一行输入时间HH:MM:SS 第二行输入时间hh:mm:ss

输出: 输出两时刻内经过的秒数。

输入样例1: 06:16:02

06:17:22

输出样例1: 80

输入样例2: 23:59:59

00:00:01

输出样例2: 2


2.4.1 分析题目

本题还是字符串的处理,计算两个时间的差

2.4.2 思维发散

看到输入既有:数字,就知道不“简单”,果然又要处理字符串。

还有一个点,就是第二个样例,第二天和第一天的时间的处理

2.4.3 思路整理
  • 将字符串转换为整数
  • 分情况(第一天、第二天)做差
2.4.4 代码
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
string t1, t2;
int ans;
int format(string& s1)
{int h = stoi(s1.substr(0, 2));int m = stoi(s1.substr(3, 2));int s = stoi(s1.substr(6, 2));return h * 3600 + m * 60 + s;
}
int main()
{cin >> t1 >> t2;int s1 = format(t1);int s2 = format(t2);if(s2 > s1){ans = s2 - s1;}else{ans = 24 * 3600 + s2 - s1;}cout << ans << endl;return 0;
}

结果

在这里插入图片描述
在这里插入图片描述

2.1.5 总结

字符串分割的处理:没有像其他语言一样的split函数,C++有自己的分割方法

  • 使用stringstream

    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <string>
    using namespace std;vector<string> split(const string& str, char delimiter) {vector<string> tokens;stringstream ss(str);string token;while (getline(ss, token, delimiter)) {tokens.push_back(token);}return tokens;
    }int main() {string timeStr = "12:34:56";vector<string> parts = split(timeStr, ':');for (const auto& part : parts) {cout << part << endl;}return 0;
    }
    
  • 使用findsubstr

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;vector<string> split(const string& str, char delimiter) {vector<string> tokens;size_t start = 0;size_t end = str.find(delimiter);// npos:无效位置while (end != string::npos) {tokens.push_back(str.substr(start, end - start));start = end + 1;end = str.find(delimiter, start);}// 添加最后一个部分tokens.push_back(str.substr(start));return tokens;
    }
    
  • 处理多个分隔符

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;vector<string> split(const string& str, const string& delimiters) {vector<string> tokens;size_t start = 0;size_t end = str.find_first_of(delimiters);while (end != string::npos) {if (end != start) { // 避免空字符串tokens.push_back(str.substr(start, end - start));}start = end + 1;end = str.find_first_of(delimiters, start);}if (start < str.length()) {tokens.push_back(str.substr(start));}return tokens;
    }int main() {string text = "hello,world;test|example";vector<string> parts = split(text, ",;|");for (const auto& part : parts) {cout << part << endl;}return 0;
    }
    

三、小结

今日份刷题结束~

排序算法的复习将近,字符串的应用层出不穷,模板也用起来啦~感觉良好

http://www.dtcms.com/a/586900.html

相关文章:

  • 深圳制作网站建设的企业网站高转化页面
  • STM32项目分享:基于STM32的智能婴儿监护系统设计
  • 黄页推广引流网站网站云主机吗
  • 网站建设策划ppt音乐培训如何做网站宣传
  • 制作简历的免费网站wordpress更改电子邮箱验证功能
  • 前端页面白屏排查终极指南:从定位到解决,再到监控 SDK 实现
  • 高通Android DDR分区报错无法启动
  • 做视频类网站需要哪些许可网站制作多少钱一年
  • linux主机上传网站网站免费优化软件
  • 南京市溧水区建设局网站wordpress只能看主页
  • 网站流程图制作软件做外贸网站推广
  • 挖掘关键词爱站网番禺 大石网站建设
  • 基于单片机的智能豆浆机设计(加热打浆熬煮自动控制与防干溢保护)
  • 山东省工程建设管理协会网站网站用户体验评价方案
  • 使用Docker安装Immich照片和视频管理工具
  • 一本通网站1124题:矩阵加法
  • 成都建站费用商丘雷光网络科技有限公司
  • S13 排序算法--快速排序
  • 关于生命意义的问题,在语言这一逻辑范畴内无法解决
  • 顺势而为——交易记录
  • 使用Labelme进行图像标注
  • 商丘网站建设推广公司网站建设管理的规章制度
  • 做网站需要学那些房地产网站制作
  • 做电商网站用什么语言中国十大网络运营商是哪些
  • 基于springboot的民间救援队救助系统
  • 四川铁科建设监理有限公司官方网站国家工商注册网官网
  • 手机网站 分辨率简述建设网站建设的基本流程
  • 什么样的企业要做网站国家示范院校建设网站
  • 一本通网站1125题:矩阵乘法
  • VISN艺术雕刻柜:以现代技艺重塑“老钱风”家居美学