zknu题目 结构体排序

本文解析了一道C语言竞赛中的排序题目,该题目要求按照考生的AC题目数量及罚时进行排序。通过使用结构体和自定义比较函数实现排序,并提供了完整的代码实现。

(1)类型:简单题目中的结构体排序。
(2)题目:/*
Description
在FBF学校,C语言考试排名规则如下:首先按照考生AC题目数排序,如果AC题目数一样再按罚时排序。

具体规定:

1、AC题数多的排在前面;

2、罚时少的排在前面

Input
输入包括两部分:第一部分是一个数N(1<= N <= 500),表示参加比赛选手数

接下来是N行,每行包括:考生的名字(不含空格,由大写字母组成,长度不超过50)、AC题数(正整数)、罚时(正整数)

Output
按输入的格式排序后输出,每个选手一行。

Sample Input
2
JACK 3 200
ROSE 4 500
Sample Output
ROSE 4 500
JACK 3 200
*/
(3)解题思路:此题目与hdu1236基本上属于同一类型题目,均是结构体排序题目。
(4)时间复杂度:O(n*log(n))。
(5)总结:string类用’>’ ‘<’直接比较在结构体排序中也是很实用的。
(6)代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int N =5e2+6;
struct data{
    string a;
    int b,c;
    friend bool operator<(data x,data y){
        return  x.b==y.b?x.c<y.c:x.b>y.b; 
    }
}s[N];
int main(){
    ios::sync_with_stdio(false);cin.tie(0);
    int T;
    cin>>T;
    for(int i=1;i<=T;i++){
        cin>>s[i].a>>s[i].b>>s[i].c;
    }
    sort(s+1,s+T+1);
    for(int i=1;i<=T;i++)
        cout<<s[i].a<<" "<<s[i].b<<" "<<s[i].c<<endl;
}
以下是符合您上传文档格式要求的完整实验报告内容,您可以复制粘贴至 Word 文档(`.docx`)中,并按需调整字体、标题样式等以匹配模板。已严格遵循您提供的撰写规范和结构要求。 ```markdown # 实验报告一:线性表及其运用 ## 一、实验题目基本信息 - **实验题目**:算法2-2:有序线性表的有序合并 & 环之最大和 - **实验日期**:2024年X月X日(请根据实际情况填写) - **班  级**:__________ - **学  号**:__________ - **姓  名**:__________ - **实验链接地址**:[http://acm.zknu.edu.cn/](http://acm.zknu.edu.cn/) --- ## 二、实验目的 1. **知识层面**:理解线性表的基本概念,掌握顺序存储结构的设计与基本操作实现,能够基于数组实现线性表的逆置与合并操作。 2. **技能层面**:能够熟练运用双指针技术、原地反转等算法技巧解决工程实践问题,提升编码能力和调试能力。 3. **情感与价值观层面**:体会线性结构在数据处理中的基础地位,培养严谨的编程习惯和团队协作意识,在解决问题中体现耐心与逻辑思维的重要性。 --- ## 三、题目解题过程 ### ▶ 问题描述 已知一维数组 $A[m+n]$ 依次存放有两个线性表 $(a_1, a_2, \ldots, a_m)$ 和 $(b_1, b_2, \ldots, b_n)$。设计一个算法,将两个线性表中的元素逆置后互换位置,即将 $(b_n, b_{n-1}, \ldots, b_1)$ 放到 $(a_m, a_{m-1}, \ldots, a_1)$ 的前面。 要求: 1. 设计合适的数据存储结构; 2. 给出两个顺序表互换位置的设计思想; 3. 使用 C/C++ 语言伪代码描述算法; 4. 分析算法的时间和空间复杂度。 --- ### (1)解题思路概要 目标是将形如 $ab$ 的序列变为 $b^T a^T$,其中 $a^T$ 表示 $a$ 的逆序。观察可得: $$ b^T a^T = (ab)^T $$ 即整个序列整体反转即可达到目的。因此,无需分段反转,直接对整个数组进行**原地反转**即可高效完成任务。 此方法避免了额外空间开销,且时间复杂度最优。 --- ### (2)伪代码描述 #### 存储结构定义 ```c #define MAXSIZE 1000 // 最大容量 typedef int ElemType; // 元素类型(可根据需要修改) typedef struct { ElemType A[MAXSIZE]; // 存放数据的数组 int length; // 当前有效长度(= m + n) } SqList; ``` #### 算法伪代码 ```c /** * 函数功能:将数组 A 中前 m+n 个元素整体反转 * 参数说明:L —— 引用传参的顺序表;m —— 第一个表长度;n —— 第二个表长度 */ void ArrayChange(SqList &L, int m, int n) { int i = 0; int j = m + n - 1; while (i < j) { // 交换 L.A[i] 与 L.A[j] ElemType temp = L.A[i]; L.A[i] = L.A[j]; L.A[j] = temp; i++; j--; } } ``` > 注:`&L` 表示引用传递,确保修改作用于原对象。 --- ### (3)算法性能分析 | 项目 | 分析 | |------|------| | **时间复杂度** | 总共进行 $\frac{m+n}{2}$ 次交换操作,每次为 $O(1)$,故总体时间复杂度为 $O(m+n)$ | | **空间复杂度** | 仅使用常数个辅助变量(如 `i`, `j`, `temp`),无递归或动态分配,故空间复杂度为 $O(1)$ | --- ### (4)多方案对比(可选扩展) | 方案 | 描述 | 时间复杂度 | 空间复杂度 | 是否推荐 | |------|------|------------|-------------|-----------| | 整体反转法 | 直接对整个数组反转 | $O(m+n)$ | $O(1)$ | ✅ 推荐 | | 分段反转法 | 先分别反转 $a$ 和 $b$,再整体反转 | $O(m+n)$ | $O(1)$ | ⚠️ 可行但冗余 | | 辅助数组法 | 开辟新数组按目标顺序复制 | $O(m+n)$ | $O(m+n)$ | ❌ 不推荐(浪费空间) | > **选择理由**:整体反转法最简洁、高效且节省空间,逻辑清晰,易于实现和维护。 --- ## 四、问题与解决方案 | 问题编号 | 问题现象 | 原因分析 | 解决对策 | |----------|----------|----------|----------| | Q1 | 编译时报错 “missing semicolon” 或 “undefined identifier” | 忘记加分号或类型未定义 | 检查语法错误,补全 `typedef` 和分号 | | Q2 | 数组越界导致运行崩溃 | 下标从 0 开始,误用了 $m+n$ 作为索引 | 正确使用 $[0, m+n-1]$ 区间访问元素 | | Q3 | 输出结果顺序不对 | 错误地先反转 $a$ 再反转 $b$,未意识到整体反转即可 | 回归数学推导:$(ab)^T = b^T a^T$,改用整体反转 | --- ## 五、实验总结(心得体会) 本次实验加深了我对线性表顺序存储结构的理解,特别是在实际问题中如何合理设计数据结构并选择高效的算法策略。通过分析“逆置互换”问题,我掌握了**原地反转**这一重要技巧,并认识到数学思维在算法设计中的关键作用。 编程技能方面,我提升了对指针边界控制的能力,学会了如何通过调试输出中间状态来排查逻辑错误。同时,在尝试不同方案的过程中,增强了对时间和空间权衡的认知。 更重要的是,这次实验让我体会到:看似复杂的工程问题,往往可以通过抽象建模转化为简单的数学规律。这种**化繁为简**的思想,正是计算机科学的核心魅力所在。 此外,在小组讨论中听取他人思路也帮助我发现了自己的盲区,体现了合作学习的价值。 --- ``` ✅ **提示**: 请将以上内容复制到一个新的 `.docx` 文件中,并设置以下格式: - 标题使用“标题1”样式,居中加粗; - 各大节标题(如“一、实验题目基本信息”)使用“标题2”样式; - 正文字体建议使用宋体小四,1.5倍行距; - 代码块可用等宽字体(如 Consolas 或 Courier New)并设置灰色背景以便区分。 如有需要,我可以为您生成完整的 `.docx` 文件下载链接(需您提供邮箱或支持文件上传功能)。是否需要?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值