[PTA]习题3-3 出租车计价

Spring-_-Bear 的 CSDN 博客导航

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

  • 起步里程为 3 公里,起步费 10 元;
  • 超起步里程后 10 公里内,每公里 2 元;
  • 超过 10 公里以上的部分加收 50% 的回空补贴费,即每公里 3 元;
  • 营运过程中,因路阻及乘客要求临时停车的,按每 5 分钟 2 元计收(不足 5 分钟则不收费)。

输入格式:

输入在一行中给出输入行驶里程(单位为公里,精确到小数点后 1 位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:

在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:

2.6 2

输出样例1:

10

输入样例2:

5.1 4

输出样例2:

14

输入样例3:

12.5 9

输出样例3:

34

来源:

来源:PTA | 程序设计类实验辅助教学平台
链接:https://pintia.cn/problem-sets/12/exam/problems/279

提交:

在这里插入图片描述

题解:

#include<stdio.h>

int main(void) {
    float distance;
    int time;
    scanf("%f%d", &distance, &time);

    float cost = 0;
    if (distance > 0 && distance <= 3) {
        // 距离小于 3 公里,车费为起步价 10 元加上等待时间的费用
        cost = 10 + (time / 5) * 2;
    } else if (distance > 3 && distance <= 10) {
        // 距离大于 3 公里且小于 10 公里,3 公里以内部分 10 元,超过部分每公里 2 元,再加上等待时间的费用
        cost = 10 + 2 * (distance - 3) + (time / 5) * 2;
    } else if (distance > 10) {
        // 距离大于 10 公里,10 公里内,前 3 公里 10 元,后 7 公里每公里 2 元共 14 元,超过 10 公里部分每公里 3 元,再加上等待时间的费用
        cost = 24 + (distance - 10) * 3 + (time / 5) * 2;
    }

    printf("%.0f", cost);

    return 0;
}
<think>嗯,用户想要了解PTA陈越的数据结构题目6-3单链表逆转的实现方法。首先,我需要回忆一下单链表逆转的常见方法。通常有两种方法,递归法和迭代法。递归法可能比较简洁,但可能在长链表时会有栈溢出的问题;迭代法则是更常用且高效的方式,通过调整指针指向来逐个反转节点。 用户提到参考了头插法和尾插法,这可能与链表逆转有关。头插法在创建链表时是每次将新节点插入头部,而逆转链表的过程其实类似于头插法的思路,把每个节点依次移动到头部。比如,原来的链表是1->2->3->4,逆转后变成4->3->2->1,这个过程可以通过逐个将节点取出并插入新链表的头部来实现。 接下来,我需要确认题目具体要求。根据引用[2]中的链表结点定义,结构体包括Data和Next指针,所以逆转函数需要操作这些指针。题目中的函数应该接收一个头节点指针,并返回逆转后的新头节点。 迭代法的步骤大致是:维护三个指针prev、current、next,逐个反转current的Next指向prev,然后向前移动三个指针,直到current为NULL。这时候prev就是新的头节点。不过具体实现时要注意保存下一个节点,否则反转后无法继续遍历。 比如,初始时prev是NULL,current是头节点。每次循环,先保存current的下一个节点到next_temp,然后将current的Next指向prev,接着prev和current分别向前移动。直到current为空,prev就是新的头节点。 代码部分需要符合题目给出的函数签名,比如List Reverse(List L),其中List是指向结构体的指针。测试用例的话,例如输入链表1->2->3->4,逆转后应为4->3->2->1,同时需要考虑空链表和只有一个节点的情况。 另外,用户可能遇到的常见错误包括没有正确处理指针导致链表断裂,或者没有正确更新头节点。比如,在反转过程中,如果没有保存next节点,就会丢失后续链表的信息,导致无法继续反转。 参考引用中的头插法和尾插法,头插法在这里可能被用来构建逆转后的链表,每次将当前节点插入到新链表的头部。这可能与迭代法的思路类似。 总结实现步骤:遍历原链表,逐个改变节点的Next指针指向,直到遍历完成,最后返回新的头节点。需要注意边界条件,如空链表或单节点链表直接返回原头节点。</think>### PTA 6-3 单链表逆转实现方法 #### 1. 题目分析 题目要求实现单链表的逆置操作,即原链表的表头变为表尾,表尾变为表头。例如: - 原链表:$1 \rightarrow 2 \rightarrow 3 \rightarrow NULL$ - 逆转后:$3 \rightarrow 2 \rightarrow 1 \rightarrow NULL$ 链表结点定义为: ```c typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; ``` #### 2. 实现思路(迭代法) **核心逻辑**:通过遍历链表,逐个修改指针方向,最终将链表逆转。需要维护三个指针: - `prev`:指向已逆转部分的头节点 - `current`:当前待处理节点 - `next_temp`:保存下一个待处理节点 **步骤**: 1. 初始化`prev = NULL`,`current = L`(原链表头) 2. 遍历链表: - 保存下一个节点:`next_temp = current->Next` - 反转指针:`current->Next = prev` - 移动指针:`prev = current`,`current = next_temp` 3. 最终`prev`为新链表的头节点 #### 3. 代码实现 ```c List Reverse(List L) { List prev = NULL; List current = L; List next_temp = NULL; while (current != NULL) { next_temp = current->Next; // 保存下一个节点 current->Next = prev; // 反转指针 prev = current; // prev前移 current = next_temp; // current前移 } return prev; // prev最终指向新链表头 } ``` #### 4. 关键点说明 - **指针操作顺序**:必须先用`next_temp`保存`current->Next`,否则反转后无法找到下一个节点[^2] - **边界条件**: - 空链表直接返回`NULL` - 单节点链表无需处理,直接返回原头节点 - **时间复杂度**:$O(n)$,仅需一次遍历 #### 5. 测试用例示例 ```c // 输入:1 -> 2 -> 3 -> 4 -> NULL // 输出:4 -> 3 -> 2 -> 1 -> NULL ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春天熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值