返回 课程

信奥AC之路-1级

0% 完成
0/0 步骤
  1. 第1课 开发环境与基础输出
    5 主题|小节
  2. 第2课 算术运算符
    7 主题|小节
  3. 第3课 printf与运算输出
    7 主题|小节
  4. 第4课 数的进制与拆位
    6 主题|小节
  5. 第5课 变量与基础运算
    17 主题|小节
  6. 第6课 常量与取整运算
    8 主题|小节
  7. 第7课 关系运算
    8 主题|小节
  8. 第8课 逻辑运算
    9 主题|小节
  9. 第9课 输入与计算进阶
    10 主题|小节
  10. 第10课 if语句及双分支语句
    8 主题|小节
  11. 第11课 if语句及双分支进阶
    11 主题|小节
  12. 第12课 三目运算
    9 主题|小节
  13. 第13课 多分支、多if和switch语句
    11 主题|小节
  14. 第14课 循环(基本输出)
    7 主题|小节
  15. 第15课 循环(While+If)
    8 主题|小节
  16. 第16课 循环(计数、求和、求乘积)
    10 主题|小节
  17. 第17课 循环进阶(While+)
    8 主题|小节
  18. 第18课 do-while及while其他用法
    8 主题|小节
  19. 第19课 For循环基础
    9 主题|小节
  20. 第20课 For循环进阶
    8 主题|小节
课 13, 主题|小节 5
进行中

13.4 复杂应用实验

2025年9月22日
课 进展
0% 完成

“小朋友们,接下来我们来看一个稍微复杂的应用实例,”我说,”这个实验将综合运用我们学过的知识,解决一个实际问题。”

13.4.1 小鱼的航程

实验六:计算小鱼游泳的总距离

题目描述:有一只小鱼,它平日每天游泳250公里,周末休息(实行双休日)。假设从周x开始算起,过了n天以后,小鱼一共累计游泳了多少公里呢?

样例输入

3 10

样例输出

2000

代码实现

#include <bits/stdc++.h>
using namespace std;

int main(){
    int x;                      // 从周x开始(1表示周一,7表示周日)
    int n;                      // 经过n天
    cin >> x >> n;              // 输入起始日和天数
    
    int sum = n / 7 * 250 * 5;  // 计算整周的游泳距离(每周5天,每天250公里)
    int y = n % 7;              // 计算剩余的不足一周的天数
    
    if(y == 1){                 // 如果剩余1天
        if(x != 6 && x != 7){   // 如果这一天不是周六或周日
            sum += 250;         // 则小鱼游泳,距离增加250公里
        }
    }else if(y == 2){           // 如果剩余2天
        if(x == 1 || x == 2 || x == 3 || x == 4){
            sum += 250 * 2;     // 如果起始日是周一至周四,则游泳2天
        }else if(x == 5 || x == 7){
            sum += 250;         // 如果起始日是周五或周日,则游泳1天
        }
    }else if(y == 3){           // 如果剩余3天
        if(x == 1 || x == 2 || x == 3){
            sum += 250 * 3;     // 如果起始日是周一至周三,则游泳3天
        }else if(x == 4 || x == 7){
            sum += 250 * 2;     // 如果起始日是周四或周日,则游泳2天
        }else{
            sum += 250;         // 如果起始日是周五或周六,则游泳1天
        }
    }else if(y == 4){           // 如果剩余4天
        if(x == 1 || x == 2){
            sum += 250 * 4;     // 如果起始日是周一或周二,则游泳4天
        }else if(x == 3 || x == 7){
            sum += 250 * 3;     // 如果起始日是周三或周日,则游泳3天
        }else{
            sum += 250 * 2;     // 如果起始日是周四至周六,则游泳2天
        }
    }else if(y == 5){           // 如果剩余5天
        if(x == 1){
            sum += 250 * 5;     // 如果起始日是周一,则游泳5天
        }else if(x == 2 || x == 7){
            sum += 250 * 4;     // 如果起始日是周二或周日,则游泳4天
        }else{
            sum += 250 * 3;     // 如果起始日是周三至周六,则游泳3天
        }
    }else if(y == 6){           // 如果剩余6天
        if(x == 1 || x == 7){
            sum += 250 * 5;     // 如果起始日是周一或周日,则游泳5天
        }else{
            sum += 250 * 4;     // 如果起始日是周二至周六,则游泳4天
        }
    }
    
    cout << sum;                // 输出总游泳距离
    return 0;
} 

思考

  1. 这个问题需要考虑起始日期和天数的组合,情况比较复杂
  2. 解决方法是先计算整周的距离,再处理剩余天数
  3. 对于剩余天数,需要根据起始日期判断有多少个工作日
  4. 使用多分支结构处理不同的剩余天数情况
  5. 在每个分支中,再使用嵌套的条件判断处理不同的起始日期
  6. 这个问题也可以用模拟法解决,即逐天计算,但代码会更长